广告
返回顶部
首页 > 资讯 > 精选 >Java中IO流的示例分析
  • 190
分享到

Java中IO流的示例分析

2023-06-20 18:06:34 190人浏览 薄情痞子
摘要

这篇文章主要为大家展示了“Java中io流的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中IO流的示例分析”这篇文章吧。I/O简介I/O是Input/output的缩写,在ja

这篇文章主要为大家展示了“Java中io流的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中IO流的示例分析”这篇文章吧。

    I/O简介

    I/O是Input/output的缩写,在java中,对于数据的输入和输出以流的方式进行。java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。 

    输入输出都是基于内存的角度来说的。输入:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。 输出:输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中。

    流的分类

    操作数据单位不同分为:字节流(8 bit),字符流(16 bit)

    数据流的流向不同分为:输入流,输出流

    流的角色的不同分为:节点流,处理流  

    节点流:直接从数据源或目的地读写数据。  

    处理流:不直接连接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。 相当于是二次包装。

    抽象基类字节流字符流
    输入流InputStreamReader
    输出流OutputStreamWriter

    Java的IO流共涉及40多个类,实际上非常规则,都是从这4个抽象基类派生的。由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。

    字节流和字符流常用api

    InputStream

    • int read():从输入流中读取数据的下一个字节。返回0到255范围内的int字节值。如果读到流的末尾,则返回 -1。 此方法一次只读一个字节,效率太低,一般不用

    • int read(byte[] b):从此输入流中将最多b.length个字节的数据保存到一个byte数组中。返回实际读取字节长度,如果读到流的末尾,也返回 -1。

    • int read(byte[] b,int off,int len):将输入流中最多len个数据字节读入byte数组。尝试读取len个字节,但读取的字节也可能小于该值,实际读取个数以读取到的为准,比如长度为23个字节的内容,每次读取5个字节,则第五次读取流并没处于末尾,还剩长度是3,故返回3。第六次读取发现是末尾,则返回 -1 。一般都用此方法。

    • public void close() throws IOException:关闭此输入流并释放与该流关联的所有系统资源,一定要关闭。

    Reader

    • Reader和InputStream类似,就是将字节数组换成了字符数组

    • int read(); 效果与字节流一致

    • int read(char[] cbuf); 效果与字节流一致

    • int read(char[] cbuf,int off,int len); 效果与字节流一致

    • public void close() throws IOException;关闭此输入流并释放与该流关联的所有系统资源,字符流的必须要关闭,不然会出问题

    OutputStream

    • void write(int b) :将指定的字节写入此输出流。

    • void write( byte[] b) :将b.length个字节从指定的byte数组写入此输出流。

    • void write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入此输出流。

    • public void flush() throws IOException:刷新此输出流并强制写出所有缓冲的输出字节,调用此方法指示应将这些字节立即写入它们预期的目标。就是将缓冲的字节全部写出到字节或字符数组中。

    • public void close() throws IOException:关闭此输入流并释放与该流关联的所有系统资源

    Writer

    • void write(int c):写入单个字符。

    • void write(char[] cbuf):写入字符数组。

    • void write(char[] cbuf,int off,int len) : 写入字符数组的某一部分。从off开始,写入len个字符

    • void write(String str):写入字符串

    • void write(String str,int off,int len):写入字符串的某一部分。

    • void flush():刷新该流的缓冲,则立即将它们写入预期目标。

    • public void close() throws IOException:关闭此输入流并释放与该流关联的所有系统资源

    字节字符流相关操作

    字节流读取文本内容

    // 读取文本文件内容,用字节流去读,可能会乱码    public void test1() {        InputStream inputStream = null;        try {            inputStream = new FileInputStream("hello.txt");//相对路径是工程路径下            int len;            byte[] bytes = new byte[5];// 定义5字节长度的byte数组            while ((len = inputStream.read(bytes)) != -1) {// 将数据读到byte数组中                System.out.println(new String(bytes, 0, len)); //打印到控制台            }        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (inputStream != null) {                    inputStream.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }}

    字符流读取文本内容

    // 读取文本文件内容,用字符流去读,不会乱码,最多重复    public void test2() {        Reader reader = null;        try {            reader = new FileReader("hello.txt");            int len;            char[] charBuff = new char[5];            while ((len = reader.read(charBuff)) != -1) {//                System.out.println(new String(charBuff)); // 注意这两行的代码区别                System.out.println(new String(charBuff, 0, len));            }        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (reader != null) {                    reader.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }    }

    字节流读取文件到输出到指定位置

    public void test3() {        InputStream inputStream = null;        OutputStream outputStream = null;        try {            inputStream = new FileInputStream("hello.txt"); // 读取文件            outputStream = new FileOutputStream("hello2.txt"); // 相对路径,默认是工程路径下            int len;            byte[] bytes = new byte[5];            while ((len = inputStream.read(bytes)) != -1) {                outputStream.write(bytes, 0, len);            }        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (inputStream != null) {                    inputStream.close();                }                if (outputStream != null){                    outputStream.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }    }

    字符流读取文件到输出到指定位置

    字符流读取文件到输出到指定位置时,如果没有手动关闭流,则不会输出到指定位置,需要手动flush。但是如果在finally块中关闭了流,则会自动flush。在close()操作中,会帮我们flush。

    public void test4() {        Reader reader = null;        Writer writer = null;        try {            reader = new FileReader("hello2.txt");            writer = new FileWriter("hello3.txt");            int len;            char[] charBuff = new char[5];            while ((len = reader.read(charBuff)) != -1) {                writer.write(charBuff, 0, len);//                writer.flush();            }        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (reader != null) {                    reader.close();                }                if (writer != null) { // 一定要关闭字符流,否则要手动flush                    writer.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }    }

    注意,字符流用来处理字符串很便捷,并且只能操作普通的文本文件,例如:.txt,.java,.c,.cpp 等语言的源代码。尤其注意.doc,excel,ppt这些不是文本文件。字节流既可以操做文本文件,也可以操作字节文件,比如.mp3,.avi,.rmvb,mp4,.jpg,.doc,.ppt。如果用字符流来操作图片等字节文件,生成的文件是无法打开的!

    缓冲流

    为了提高数据读写的速度,Java API提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组,缺省使用8192个字节(8Kb) 的缓冲区。

    缓冲流要“套接”在相应的节点流之上,根据数据操作单位可以把缓冲流分为BufferedInputStream和ufferedOutputStream以及BufferedReader和BufferedWriter。分别对应字节缓冲流和字符缓冲流。相当于在字节和字符流上包装了一下。

    BufferedInputStream和BufferedOutputStream
    public void test() {        InputStream inputStream ;        OutputStream outputStream ;        BufferedInputStream bis = null;        BufferedOutputStream bos = null;        try {            inputStream = new FileInputStream("modify.txt"); //小于8KB            outputStream = new FileOutputStream("modify2.txt");            bis = new BufferedInputStream(inputStream);            bos = new BufferedOutputStream(outputStream);            int len;            byte[] bytes = new byte[5];            while ((len = bis.read(bytes)) != -1) {                bos.write(bytes, 0, len);            }        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (bis != null) {                    bis.close();                }                if (bos != null){                    bos.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }    }
    BufferedReader和BufferedWriter
    public void test2() {        Reader reader ;        Writer writer ;        BufferedReader br = null;        BufferedWriter bw = null;        try {            reader = new FileReader("modify.txt");            writer = new FileWriter("modify2.txt");            br = new BufferedReader(reader);            bw = new BufferedWriter(writer);            int len;            char[] bytes = new char[5];            while ((len = br.read(bytes)) != -1) {                bw.write(bytes, 0, len);            }        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (br != null) {                    br.close();                }                if (bw != null){                    bw.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }    }

    **缓冲流如果没有手动关闭流,且读取的文件小于底层缓存大小8KB,是不会自动写到目标中去的,需要手动flush。**在关闭流时,只需关闭缓冲流即可,它会自动关闭它包装的底层节点流。

    数据流

    为了方便地操作Java语言的基本数据类型和String的数据,可以使用数据流。数据流有两个类:DataInputStream和DataOutputStream, 别“套接”在InputStream和OutputStream子类的流上。

    使用如下:

     public void test() {        DataOutputStream dos = null;        try {            OutputStream outputStream = new FileOutputStream("data.txt");            dos = new DataOutputStream(outputStream);            dos.writeUTF("热烈庆祝中国共产党成立一百周年");            dos.writeInt(100);            dos.writeBoolean(true);            System.out.println("成功!");        } catch (IOException e) {            e.printStackTrace();        } finally {            try {                if (dos != null) {                    dos.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }    }    public void test2(){        DatainputStream dis =  null;        try {            InputStream inputStream = new FileInputStream("data.txt");            dis = new DataInputStream(inputStream);            System.out.println(dis.readUTF()); //读取时要按照写入顺序读取            System.out.println(dis.readInt());            System.out.println(dis.readBoolean());            System.out.println("成功!");        } catch (IOException e) {            e.printStackTrace();        } finally {            try {                if (dis != null) {                    dis.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }    }

    对象流

    用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。

    • 序列化:用ObjectOutputStream类保存基本类型数据或对象的机制

    • 反序列化:用ObjectInputStream类读取基本类型数据或对象的机制

    • ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量

    序列化与反序列化的演示

    先定义一个Person类,该类必须实现Serializable接口,否则序列化时会报java.io.NotSerializableException 的错误

    package day07;import java.io.Serializable;import java.util.Date;public class Person implements Serializable {    private static final long serialVersionUID = -5858950242987134591L;    private String name;    private Integer age;    private Date date;    public Person(){}    public Person(String name, Integer age, Date date) {        this.name = name;        this.age = age;        this.date = date;    }  // getter、setter略    @Override    public String toString() {        return "Person{" +                "name='" + name + '\'' +                ", age=" + age +                ", date=" + date +                '}';    }}
    序列化
    public void test() {        ObjectOutputStream oos = null;        try {            OutputStream outputStream = new FileOutputStream("person.txt"); // 创建输出流对象,指定输出位置            oos = new ObjectOutputStream(outputStream); // 包装输出流            oos.writeObject(new Person("张三",22,new Date())); // 序列化对象            System.out.println("序列化成功!");        } catch (Exception e) {            e.printStackTrace();        } finally {            if (oos!=null){                try {                    oos.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }
    反序列化
    public void test2() {        ObjectInputStream ois = null;        try {            InputStream inputStream = new FileInputStream("person.txt");            ois = new ObjectInputStream(inputStream);            Person person = (Person) ois.readObject();            System.out.println("person姓名为:" + person.getName());            System.out.println("person年龄为:" + person.getAge());            SimpleDateFORMat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒");            System.out.println("创建时间为:" + sdf.format(person.getDate()));        } catch (IOException e) {            e.printStackTrace();        } catch (ClassNotFoundException e) {            e.printStackTrace();        } finally {            if (ois != null) {                try {                    ois.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }

    Java中IO流的示例分析

    无论如何反序列化,时间都是不变的。

    以上是“Java中IO流的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

    --结束END--

    本文标题: Java中IO流的示例分析

    本文链接: https://www.lsjlt.com/news/298805.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Java中IO流的示例分析
      这篇文章主要为大家展示了“Java中IO流的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中IO流的示例分析”这篇文章吧。I/O简介I/O是Input/output的缩写,在ja...
      99+
      2023-06-20
    • Java-IO流的示例分析
      小编给大家分享一下Java-IO流的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言项目结构如下,在使用代码的时候注意修改成你自己的包名和类名一、资源管...
      99+
      2023-06-20
    • Java IO中包装流的示例分析
      这篇文章主要介绍了Java IO中包装流的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。根据功能分为节点流和包装流(处理流)节点流:可以从或向一个特定的地方...
      99+
      2023-06-26
    • Java中File类和IO流的示例分析
      这篇文章主要为大家展示了“Java中File类和IO流的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中File类和IO流的示例分析”这篇文章吧。IO流:IO流概述:IO:输入/...
      99+
      2023-06-29
    • Java中IO操作字节流与字符流的示例分析
      这篇文章主要为大家展示了“Java中IO操作字节流与字符流的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中IO操作字节流与字符流的示例分析”这篇文章吧。IO操作字节流java....
      99+
      2023-06-29
    • Java IO中字节输入输出流的示例分析
      这篇文章主要介绍Java IO中字节输入输出流的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!讲的是字节输入输出流:InputStream、OutputSteam(下图红色长方形框内),红色椭圆框内...
      99+
      2023-06-26
    • Java的File类和IO流实例分析
      本文小编为大家详细介绍“Java的File类和IO流实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java的File类和IO流实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。IO流:IO流概述:I...
      99+
      2023-06-29
    • Java中IO流文件读取、写入和复制的示例分析
      小编给大家分享一下Java中IO流文件读取、写入和复制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!//构造文件File类File f=new File...
      99+
      2023-05-30
      java
    • Linux IO的示例分析
      这篇文章给大家分享的是有关Linux IO的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是Linux系统Linux是一种免费使用和自由传播的类UNIX操作系统,是一个基于POSIX的多用户、多任务、...
      99+
      2023-06-14
    • java IO中字节和字符的示例分析
      这篇文章给大家分享的是有关java IO中字节和字符的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queue队列...
      99+
      2023-06-14
    • JAVA的IO流、File、字节流及字符流实例分析
      今天小编给大家分享一下JAVA的IO流、File、字节流及字符流实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。IO简...
      99+
      2023-06-30
    • JAVA中IO操作的字节流和字符流实例分析
      这篇文章主要介绍了JAVA中IO操作的字节流和字符流实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JAVA中IO操作的字节流和字符流实例分析文章都会有所收获,下面我们一起来看看吧。IO操作字节流java...
      99+
      2023-06-29
    • C++中IO流操作实例分析
      这篇“C++中IO流操作实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++中IO流操作实例分析”文章吧。1.标准输...
      99+
      2023-07-02
    • Linux中io重定向的示例分析
      这篇文章给大家分享的是有关Linux中io重定向的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Linux io重定向是将原本要输出到屏幕中的数据信息,重新定向到某个指定的文件中,或者定向到黑洞中(/de...
      99+
      2023-06-27
    • Java中IO流解析及代码实例
      目录I/O简介字节流和字符流常用API字节字符流相关操作字节流读取文本内容字符流读取文本内容字节流读取文件到输出到指定位置字符流读取文件到输出到指定位置缓冲流BufferedInpu...
      99+
      2022-11-12
    • JavaScript中节流的示例分析
      小编给大家分享一下JavaScript中节流的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言我们来聊一聊节流——另一个优化函数的思想。我们还是以移动事...
      99+
      2023-06-06
    • Java中输入/输出流体系的示例分析
      这篇文章主要介绍Java中输入/输出流体系的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java输入/输出流体系1.字节流和字符流字节流:按字节读取。字符流:按字符读取。字符流读取方便,字节流功能强大,当不...
      99+
      2023-05-30
      java
    • Java中BigDecimal的示例分析
      小编给大家分享一下Java中BigDecimal的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!引言  float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值...
      99+
      2023-06-20
    • Java中BeanUtils.copyProperties的示例分析
      这篇文章将为大家详细讲解有关Java中BeanUtils.copyProperties的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。场景开发中经常遇到,把父类的属性拷贝到子类中。通常有2种方法:...
      99+
      2023-06-20
    • java中ORM的示例分析
      这篇文章将为大家详细讲解有关java中ORM的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实现了W...
      99+
      2023-06-14
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作