input stream Out stream
DataInputStream DataIOutStream
BufferedInputStream BufferedOutStream
LineNumberInputStream PrintStream
PushbackInputStream
以字节为导
向的 stream
----------(无对应的)
BufferedReader BufferedWrite
LineNumberReader PrintWrite
以Unicode字
符为导向的
stream
PushBackReader
Table 3.0
3.1 以字节为导向的stream:
3.1.1 Input Stream
1) DataInputStream:从stream中读取基本类型(int、char等)数据。
2) BufferedInputStream:使用缓冲区
3) LineNumberInputStream:会记录input stream内的行数,然后可以调用getLineNumber()和setLineNumber(int)
4) PushbackInputStream:很少用到,一般用于编译器开发
3.1.2 . Output Stream
1) DataIOutStream:往stream中输出基本类型(int、char等)数据。
2) BufferedOutStream:使用缓冲区
3) PrintStream:产生格式化输出
3.2 以字符为导向的Stream
3.2.1 Input Stream
1) 没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader,否则使用
DataInputStream
2) BufferedReader:与BufferedInputStream对应
3) LineNumberReader:与LineNumberInputStream对应
4) PushBackReader:与PushbackInputStream对应
3.2.2 Output Stream
1) BufferedWrite:与对应
2) PrintWrite:与对应
3. 3 RandomAccessFile
1) 可通过RandomAccessFile对象完成对文件的读写操作
2) 在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw可读写
3) 可以直接跳到文件中指定的位置 Java I/O
输入/输出泛指对某个设备或环境进行数据的输入或输出。例如对硬盘进行输入/输出、对视频进行输入
/输出、对网络上主机进行输入/输出等,可以想象,因设备或环境的不同,会有各式各样的输入/输出问题
与解决方案。输入/输出问题在程序设计中实际上是一个很复杂的问题。
对于输入/输出问题,Java将之抽象化为流(Stream)对象来解决。对不同的输入/输出问题,会有相应
的流对象提供解决方案。本文章就是要学习Java中各式各样解决输入/输出问题的对象。
1、总体结构
首先,下图(table 1.0)从整体上对Java I/O进行了归纳:
Table 1.0
如果您对Decorator模式非常了解,就能轻易地看出Java的I/O类结构:根接口是 InputStream/OutputStream,
充当数据源的I/O类有FileInputStream/FileOutputStream, ByteArrayInputStream/ByteArrayOutputStream等,
充当装饰功能的IO类有 BufferedInputStream/BufferedOutputStream, DataInputStream/DataOutputStream等,
它们都是继承装饰接口 FilterInputStream/FilterOutputStream。使用I/O时,首先创建一个数据源I/O,然后根
据需要的功能创建装饰类I/O, 其构造函数的参数为已创建的数据源I/O。我们以创建一个具有缓冲的文件
输入流为例,假定需要从磁盘读取文件“C:/log.txt”:
// 创建一个FileInputStream:
FileInputStream fileInput = new FileInputStream("C://log.txt"); // 创建一个BufferedInputStream:
BufferedInputStream bufferedInput = new BufferedInputStream(fileInput);
// 现在得到的bufferedInput即是具有缓冲的文件输入流
或者进一步简写如下:
InputStream input = new BufferedInputStream(
new FileInputStream("C://log.txt"));
// 现在得到的input即是具有缓冲的文件输入流
2、充当数据源的 I/O
input stream Out stream
ByteArrayInputStream ByteArrayOutputStream
StringBufferInputStream
FileInputStream FileOutputStream
PipedInputStream PipedOutputStream
以字节为导
向的 stream
SequenceInputStream SequenceOutputStream
CharArrayReader CharArrayWrite
StringReader StringWrite
FileReader FileWrite
以Unicode字
符为导向的
stream
PipedReader PipedWrite
两种不现导
向的 stream
之间的转换
InputStreamReader OutputStreamReader
Table 2.0
2.1 以字节为导向的stream:
以字节为导向的stream,表示以字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream
包括下面几种类型:
2.1.1 . input stream
1) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
2) StringBufferInputStream:把一个String对象作为InputStream
3) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作
4) PipedInputStream:实现了pipe的概念,主要在线程中使用
5) SequenceInputStream:把多个InputStream合并为一个InputStream
2.1.2 . Output stream
1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中
2) FileOutputStream:把信息存入文件中
3) PipedOutputStream:实现了pipe的概念,主要在线程中使用 4) SequenceOutputStream:把多个OutStream合并为一个OutStream
2.2 以Unicode字符为导向的stream:
以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。以
Unicode字符为导向的stream包括下面几种类型:
2.2.1. Input Stream
1) CharArrayReader:与ByteArrayInputStream对应
2) StringReader:与StringBufferInputStream对应
3) FileReader:与FileInputStream对应
4) PipedReader:与PipedInputStream对应
2.2.2. Output Stream
1) CharArrayWrite:与ByteArrayOutputStream对应
2) StringWrite:无与之对应的以字节为导向的stream
3) FileWrite:与FileOutputStream对应
4) PipedWrite:与PipedOutputStream对应
以 字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,字
是在操作时的导向不同。如 CharArrayReader:和ByteArrayInputStream的作用都是把内存中的一个缓冲区
作为InputStream使用,所不同的 是前者每次从内存中读取一个字节的信息,而后者每次从内存中读取一个
字符。
2.3 两种不现导向的stream之间的转换
InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为
导向的stream。
2、充当数据源的 I/O
运用上面介绍的 Java 中操作 IO 的 API,我们就可完成我们想完成的任何操作了。但通过
FilterInputStream 和FilterOutStream的子类,我们可以为stream添加属性。下面以一个例子来说明这种功能
的作用。
如果我们要往一个文件中写入数据,我们可以这样操作:
FileOutStream fs = new FileOutStream(“test.txt”);
然后就可以通过产生的fs对象调用 write()函数来往test.txt 文件中写入数据了。但是,如果我们想实现
“先把要写入文件的数据先缓存到内存中, 再把缓存中的数据写入文件中”的功能时,上面的API就没有一
个能满足我们的需求了。但是通过FilterInputStream和 FilterOutStream的子类,为FileOutStream添加我们
所需要的功能。
java IO
最新推荐文章于 2024-04-26 14:00:07 发布