Java流

一、Java流式输入/输出原理

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

二、输入/输出流的分类
1. java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能,可以从不同的角度对其进行分类:
①按数据流的方向不同可以分为输入流和输出流。
②按处理数据单元不同可以分为字节流和字符流。
③按功能不同可以分为节点流和处理流。
2. JDK所提供的所有流类型位于包java.io内都分别继承自以下四种抽象流类型:

字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter

三、节点流和处理流
1. 节点流为可以从一个特定的数据源(节点)读写数据(如:文件、内存)

2. 处理流是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。

四、InputStream
1. 继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字节(8bit):

深色为节点流,浅色为处理流。

五、OutputStream
1. 继承自OutputStream的流是用于程序中输出数据,且数据的单位为字节(8bit):

深色为节点流,浅色为处理流。

六、Reader
1. 继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符(16bit):

深色为节点流,浅色为处理流。

七、Writer
1. 继承自Writer的流都是用于程序中输出数据,且数据的单位为字符(16bit):

深色为节点流,浅色为处理流。

八、节点流类型

类型字符流字节流
File(文件)FileReader
FileWriter
FileInputStream
FileOutputStream
Memory ArrayCharArrayReader
CharArrayWriter
ByteArrayInputStream
ByteArrayOutputStream
Memory StringStringReader
StringWriter
Pipe(管道)PipedReader
PipedWriter
PipedInputStream
PipedOutputStream

九、处理流类型

处理类型字符流字节流
BufferingBufferedReader
BufferedWriter
BufferedInputStream
BufferedOutputStream
FilteringFilterReader
FilterWriter
FilterInputStream
FilterOutputStream
Converting between bytes
and character
InputStreamReader
OutputStreamWriter
Object serializationObjectInputStream
ObjectOutputStream
Data conversionDataInputStream
DataOutputStream
CountingLineNumberReaderLineNumberInputStream
Peeking aheadPushbackReaderPushbackInputStream
PrintingPrintWriterPrintStream

十、缓冲流
1. 缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法。
2. JDK提供了四种缓冲流,其常用的构造方法为:

BufferedReader(Reader in);
BufferedReader(Reader in, int size); //size为自定义缓冲区的大小

BufferedWriter(Writer out);
BufferedWriter(Writer out, int size);

BufferedInputStream(InputStream in);
BufferedInputStream(InputStream in, int size);

BufferedOutputStream(OutputStream out);
BufferedOutputStream(OutputStream out, int size);

3. 缓冲输入流支持其父类的mark和reset方法。
4. BufferedReader提供了readLine方法用于读取一行字符串(以\r或\n分隔)。
5. BufferedWriter提供了newLine用于写入一个行分隔符。
6. 对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush方法会使内存中的数据立刻写出。

十一、转换流
1. InputStreamReader和OutputStreamWriter用于字节数据到字符数据之间的转换。
2. InputStreamReader需要和InputStream“套接”。
3. OutputStreamWriter需要和OutputStream“套接”。
4. 转换流在构造时可以指定其编码集合,例如:

InputStream isr = new InputStreamReader(System.in, "ISO8859_1");

十二、数据流
1. DataInputStream和DataOutputStream分别继承自InputStream和OutputStream,属于处理流,需要分别“套接”在InputStream和OutputStream类型的节点流上。
2. DataInputStream和DataOutputStream提供了可以存取与机器无关的Java原始类型数据(如:int,double等)的方法。
3. DataInputStream和DataOutputStream的构造方法为:

DataInputStream(InputStream in);
DataOutputStream(OutputStream out);

十三、Print流
1. PrintWriter和PrintStream都属于输出流,分别针对于字符和字节。
2. PrintWriter和PrintStream提供了重载的print、println方法用于多种数据类型的输出。
3. PrintWriter和PrintStream的输出操作不会抛出异常,用户通过检测错误状态获取错误信息。
4. PrintWriter和PrintStream有自动flush功能。

十四、Object流
1. 直接将Object写入或读出
①transient关键字
②serializable接口
③externalizable接口

发表评论

电子邮件地址不会被公开。 必填项已用*标注