天天看点

【Java基础】IO流总结

一、流的概念:

       Java的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作,在java中把不同的输入/输出源(键盘、文件、网络连接等)抽象表述为“流”(stream)。通过流的方式允许Java程序使用相同的方式来访问不同的输入/输出源。stream是从起源(source)到接收(sink)的有序数据。

       Java把所有传统的流类型(类或抽象类)都放在java.io包中,用以实现输入/输出功能。

二、流的分类:

       1、输入流和输出流:

       按照流的流向来分,可以分为输入流和输出流:(输入、输出都是从程序运行所在内存的角度来划分的)

              (1)输入流:只能从中读取数据,而不能向其写入数据。

    (2)输出流:只能向其写入数据,而不能从中读取数据。

       2、字节流和字符流:

       字节流和字符流的用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同--字节流操作的数据单元是8位字节,而字符流操作的数据单元是16位的字符。

       3、节点流和处理流:

       按照流的角色来分,可以分为节点流和处理流:

  (1)节点流:

  可以从/从一个特定的IO设备(如磁盘、网络)读/写数据的流,称为节点流,节点流也被称为低级流(Low Level Stream)。

  下图显示了节点流示意图:

    

【Java基础】IO流总结

       从上图可以看出,当使用节点流进行输入/输出时,程序直接连接到实际的数据源,和时间的输入/输出节点连接。

       (2)处理流:

       处理流则用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能,处理流也被称为高级流。

  下图显示了处理流示意图:

      

【Java基础】IO流总结

  从上图可以看出,当使用处理流进行输入/输出时,程序并不会直接连接到实际的数据源,没有和实际的输入/输出节点连接。使用处理流的一个明显好处是,只要使用相同的处理流,程序就可以采用完全相同的输入/输出代码来访问不同的数据源,随着处理流所包装节点流的变化,程序实际所访问的数据源也相应的发生变化。

       处理流的功能主要体现在以下两个方面:

       a.性能的提高:主要以增加缓冲的方式来提高输入/输出的效率。

       b.操作的便捷:处理流可能提供了一系列便捷的方法来一次输入/输出大批量的内容,而不是输入/输出一个或多个“水滴”。

三、IO流的体系

       Java的IO流共涉及40多个类,都是从如下4个抽象基类派生的。

       1、InputStream/Reader:所有输入流的基类,前者是字节输入流,后者是字符输入流。

       2、OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流。

【Java基础】IO流总结

四、字符流和字节流有什么区别?

       字节流读取的时候,读到一个字节就返回一个字节; 字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在 UTF-8 码表中是 3 个字节)时。先去查指定的编码表,将查到的字符返回。 字节流可以处理所有类型数据,如:图片, MP3, AVI 视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。 字节流主要是操作 byte 类型数据,以 byte 数组为准,主要操作类就是 OutputStream、InputStream。

       字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。所以字符流是由 Java 虚拟机将字节转化为 2 个字节的 Unicode 字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点。在程序中一个字符等于两个字节, java 提供了 Reader、 Writer 两个专门操作字符流的类。

       规则:如果进行输入/输出的内容是文本内容,则应该考虑使用字符流;如果进行输入/输出的内容是二进制内容,则应该考虑使用字节流。

五、什么是 java 序列化,如何实现 java 序列化?

       1、概念:

         序列化:将一个Java对象写入IO流中。

         反序列化:从IO流中恢复该Java对象的过程。

       2、用途:

              对象的序列化主要有两种用途:

              (1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

              (2)在网络上传送对象的字节序列。

       序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

       注解:当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

       3、序 列 化 的 实 现 :

       使用Serializable来实现序列化非常简单,主要让目标类实现Serializable标记接口即可,无须实现任何方法。一旦某个类实现了Serializable接口,该类的对象就是可序列化的,程序可以通过如下两个步骤来序列化该对象。

       (1)创建一个ObjectOutputStream,这个输出流是一个处理流,所以必须建立在其他节点流的基础之上。如下代码所示:

//创建个 ObjectOutputStream 输出流
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("object.txt"));
           

       (2)调用ObjectOutputStream对象的writeObject()方法输出可序列化对象,如下代码所示:

//将一个Person对象输出到输入流中
oos.writeObject(per);
           

       相关链接: https://www.cnblogs.com/yangchunze/p/6728086.html

六、NIO和IO的不同:

       1、概念:NIO即 New IO,是在JDK1.4中才引入的。如果说传统的输入/输出系统是面向流的处理,则新IO则是面向块的处理。NIO的效率要比IO高很多。

       2、主要不同:

【Java基础】IO流总结

       参考链接:https://www.cnblogs.com/aspirant/p/8630283.html

七、5种IO模型

       五种IO模型包括:阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO。其中,前四个被称为同步IO。

       参考链接:https://segmentfault.com/a/1190000003063859

                         https://blog.csdn.net/ZWE7616175/article/details/80591587