1、什么是流:java
流是一个抽象的概念。当Java程序须要从数据源读取数据时,会开启一个到数据源的流。数据源能够是文件,内存或者网络等。一样,当程序须要输出数据到目的地时也同样会开启一个流,数据目的地也能够是文件、内存或者网络等。流的建立是为了更方便地处理数据的输入输出。数组
流分为字节流和字符流。字节流也称为原始数据,须要用户读入后进行相应的编码转换。而字符流的实现是基于自动转换的,读取数据时会把数据按照JVM的默认编码自动转换成字符。网络
字节流由InputStream和OutputStream处理,而字符流由Reader和Writer处理。Reader和Writer是Java后加入的处理类,出于让数据的处理更方便的目的。dom
2、字节流和字符流编码
若是数据流中最小的数据单元是字节,那么称这种流为字节流;若是数据流中最小的数据单元是字符,那么称这种流为字符流。在Java的IO系统中,java.io.InputStream和java.io.OutputStream分别表示字节输入流和字节输出流,java.io.Reader和java.io.Writer分别表示字符输入流和字符输出流。线程
I/O流的层次code
1.字节流:对象
从InputStream和OutputStream派生出来的一系列类。这类流以字节(byte)为基本处理单位。继承
◇ InputStream、OutputStream接口
◇ FileInputStream、FileOutputStream(文件流)
◇ PipedInputStream、PipedOutputStream
◇ ByteArrayInputStream、ByteArrayOutputStream
◇ FilterInputStream、FilterOutputStream
◇ DataInputStream、DataOutputStream (原始型数据流,
他们是在普通流上加了读写原始型数据的功能,因此构造他们时要先构造普通流方法:
readBoolean()/writeBoolean()
readByte()/writeByte()
readChar()/writeByte() )
◇ BufferedInputStream、BufferedOutputStream(缓冲区流)
2.字符流:
从Reader和Writer派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位。
◇ Reader、Writer
◇ InputStreamReader、OutputStreamWriter
◇ PipedReader、PipedWriter
◇ FileReader、FileWriter
◇ CharArrayReader、CharArrayWriter
◇ FilterReader、FilterWriter
◇ BufferedReader、BufferedWriter
◇ StringReader、StringWriter
3.对象流
◇ ObjectInputStream、ObjectOutputStream(
串行化:对象经过写出描述本身状态的数值来记述本身的过程叫串行化
对象流:可以输入输出对象的流
将串行化的对象经过对象流写入文件或传送到其余地方,对象流是在普通流上加了传输对象的功能,因此构造对象流时要先构造普通文件流
注意:只有实现了Serializable接口的类才能被串行化)
4.其它
◇ 文件处理:
File、RandomAccessFile;
◇ 接口
DataInput、DataOutput、ObjectInput、ObjectOutput
3、字节流
1. 处理概述:
对于字节流处理的类都继承自InputStream和OutputStream这两个抽象类。
InputStream提供的最重要的方法是:
Java代码
用于从输入流中读取字节。
OutputStream提供的最重要的方法是:
Java代码
用于将字节写入输出流。
2. 字节流:
字节流的处理类有不少,他们都继承自InputStream或者OutputStream抽象类。
输入流:
先谈谈输入流,输入流中跟数据源直接接触的类有:FileInputStream和ByteArrayInputStream,他们分别实现了从文件或者内存中的字节数组读入数据到输入流。
其余的输入流处理类都是装饰类(Decorator模式),下面对他们进行一下简单介绍:
BufferedInputStream: 提供了缓冲功能。
DataInputStream: 容许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可使用数据输出流写入稍后由数据输入流读取的数据。
PipedInputStream: 容许以管道的方式来处理流。当链接到一个PipedOutputStream后,它会读取后者输出到管道的数据。
PushbackInputStream: 容许放回已经读取的数据。
SequenceInputStream: 能对多个inputstream进行顺序处理。
输出流:
基本上每一个输入流类都有一个相应的输出流类,提供相应的输出流处理。
一样,跟数据目的地直接接触的类有:FileOutputStream和ByteArrayOutputStream,前者实现了把数据流写入文件的功能,后者实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增加。可以使用 toByteArray() 和 toString() 获取数据。
下面对其它的装饰类作一下简单介绍:
BufferedOutputStream: 提供了缓冲功能的输出流,在写出完成以前要调用flush来保证数据的输出。
DataOutputStream: 数据输出流容许应用程序以适当方式将基本 Java 数据类型写入输出流中。而后,应用程序可使用数据输入流将数据读入。
PipedOutputStream: 容许以管道的方式来处理流。能够将管道输出流链接到管道输入流来建立通讯管道。管道输出流是管道的发送端。一般,数据由某个线程写入 PipedOutputStream 对象,并由其余线程从链接的 PipedInputStream 读取。
PrintStream: 为其余输出流添加了功能,使它们可以方便地打印各类数据值表示形式。咱们常常用到的System.out或者System.err都是PrintStream。
4、字符流:
1. 字符流处理概述
全部的字符流操做类都继承自Reader或者Writer这两个抽象类。
Reader提供的重要方法有:
Java代码
他们提供了从流中读取数据到字符数组或者CharBuffer的功能。
Writer提供的重要方法有:
Java代码
write(String str, int off, int len);
他们提供了把字符、字符数组或者字符串写入流中的功能。
2. 字符流处理
输入流:
跟数据源直接接触的类:
CharArrayReader: 从内存中的字符数组中读入数据,以对数据进行流式读取。
StringReader:从内存中的字符串读入数据,以对数据进行流式读取。
FileReader:从文件中读入数据。注意这里读入数据时会根据JVM的默认编码对数据进行内转换,而不能指定使用的编码。因此当文件使用的编码不是JVM默认编码时,不要使用这种方式。要正确地转码,使用InputStreamReader。
装饰类:
BufferedReader:提供缓冲功能,能够读取行:readLine();
LineNumberReader: 提供读取行的控制:getLineNumber()等方法。
InputStreamReader: 字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。
输出流:
根数据目的相关的类:
CharArrayWriter:把内存中的字符数组写入输出流,输出流的缓冲区会自动增长大小。输出流的数据能够经过一些方法从新获取。
StringWriter: 一个字符流,能够用其回收在字符串缓冲区中的输出来构造字符串。
FileWriter:把数据写入文件。
装饰类:
BufferedWriter:提供缓冲功能。
OutputStreamWriter:字符流通向字节流的桥梁:可以使用指定的 charset 将要写入流中的字符编码成字节。
PrintWriter: 向文本输出流打印对象的格式化表示形式。
流处理中的其它方法:
mark和reset用于重复读取某段的数据,以下代码:
Java代码
Writer或者OutputStream中的flush(): 刷新该流的缓冲,用于确保数据的输出。
小结
a. 字节流:
InputStream
|-- FileInputStream (基本文件流)
|-- BufferedInputStream
|-- DataInputStream
|-- ObjectInputStream
OutputStream 同上图
BufferedInputStream,DataInputStream,ObjectInputStream 只是在FileInputStream 上增添了相应的功能,构造时先构造FileInputStream
b. 字符流:
Reader
|-- InputStreamReader (byte->char 桥梁)
|-- BufferedReader (经常使用)
Writer
|-- OutputStreamWriter (char->byte 桥梁)
|-- BufferedWriter
|-- PrintWriter (经常使用)
此文为转载备用,未知原文连接,若是侵犯了做者版权,请站内联系