JAVA中的IO 流们

时间:2022-10-12 21:35:48

         Java程序中对于数据的输入和输出操作以“流”方式进行,J2SDK提供了各种各样的“流”类,用于获取不同种类的数据;程序通过标准的方法输入和输出数据。


         java.io包中定义了多个流类型来实现输入、输出功能;从如下角度进行分类:

   数据流的方向:输入流和输出流

处理数据单位:字节流和字符流(一个字符包含两个字节)

功能:节点流和处理流

节点流:从一个特定的“数据源(节点)”读取数据

处理流:连接在已经“存在的流”上进行数据读取。

   不管有多少“流”类,最终java.io中类都继承如下四种抽象流类型:

   JAVA中的IO 流们

  

让我们来根据功能看一下javaIO 中的流

    

一、节点流


节点:数据源。通俗的理解节点流:对数据的处理是从数据源点开始进行的就属于节点流。

内容类如下图:

    JAVA中的IO 流们

  

从上表可以看出

1、节点类型,四种:File,Memory ArrayMemory String Pipe

2、字符流的方法都是:Reader/Writer;字节流则为:input/output

二、处理流 

  

1、处理流概览

处理流:是对节点流进行“处理”的一些类,不直接跟“数据源点”交互,通过节点流来达到我们需要的输入输出数据。这就是处理流的意义所在。看如下图就是处理流的内容类。

JAVA中的IO 流们


上表特点

1、操作对象:buffering(缓冲),filtering(过滤),Converting(转换),object(对象),Data ConversionPrinting(打印),Counting(计数),Peekingahead(预读)

2、字符流的方法都是:Reader/Writer;字节流则为:input/output。(同节点流) 


二、分类

通过上表处理流的不同操作对象,接下来介绍几种主要的处理流类型类型。 


1、缓冲流——buffering


套接在相应的节点流之上,对读写的数据提供了缓冲功能,可以提高读取效率,同时还可以增加一些新方法。

四个类构造如下:


JAVA中的IO 流们

2、转换流——Converting


A:上表查出转换流有两种:InputStreamReaderOutputStreamWriter两种。

B:转换流在构造时可以指定其编码集合,如:inputStream isr = new InputStreamReader(System.in,"ISO8859_1");


使用需要套接。 


3、数据流——Data Conversion


可以一次性写入一个“数据”,不然,是一个字节一个字节读取,不知道写进去,或者读出来的是什么:都是以字节读,写。例如:写入:12132434,可能读出来是 1 21 3 2 4 3 4 ,这样就模糊了。


类:DataInputStreamDataOutputStream (继承自InputStreamOutputStream

构造:DataInputStream(InputStream in)

 DataOutputStream(OutputStream out) 


特点:提供了可以存取与机器无关的java原始类型数据(int,double)方法。

使用需要套接 


4Print


这个处理流是我们最常见的输出流。

 类:PrintWriter(字符)、PrintStream(字节)。

构造如下:

JAVA中的IO 流们


特点如下:

都提供了重载的print方法,println方法用于多种数据类型的输出。

不会抛出异常,用户通过检测错误状态获取错误信息。

有自动的Flush功能。

使用需要套接 


5Object流——直接将object写入或者读出。 


类:ObjectInputStreamObjectOutputStream


重点如下:

Transient:修饰的成员变量在编译的时候不被考虑。输出的时候是看不到的值(会显示0

SerializableSerializable是标记性接口。接口内没有方法。

Externalizable:外部化接口,继承来自serializable接口,自己控制自己的序列化过程。一般不使用。如果不使用这个接口,那么直接实现serializable接口,由JDK 控制。

使用需要套接 


三、共同点——套接 


观察以上所有处理流的类构造方法中都需要参数,这个参数是做什么用的呢?——套接。通过传递的参数和要作用的对象产生关联。

处理流的使用都需要套接。套接谁?为什么要套接?

这个不难理解,因为处理流的特性就是要对字节流进行处理加工,所以处理流声明过程中,肯定要指定它要“服务”的对象。所以套接的就是字节流,具体是如下四种抽象类型:

JAVA中的IO 流们

最终还是回归到了原点,不论怎么处理,最终我们都还是对这基本四种的“流”进行变形,达到我们期望的输入输出。