Java.io 基本上包含三种类
1 建立数据流的类 ( 处理字节流,字符流 )
2 用于序列化的类和接口 ( 字节流与字符流之间进行转换 )
3 处理文件系统的类和接口 ( 对文件进行操作 )
InputStream/OutputStream 是所有字节输入输出流的超类
以字节为导向的
stream
,表示以字节为单位从
stream
中读取或往
stream
中写入信息
Reader/Writer
是所有字符输入输出流的超类
以Unicode 字符为导向的stream ,表示以Unicode 字符为单位从stream 中读取或往stream 中写入信息。
输入/输出流是按数据源而提供类的,如字节数组,String对象,文件,管道,序列,其他数据源等 Java IO 的一般使用原则:
一、按数据来源(去向)分类:
1
、是文件: FileInputStream, FileOutputStream, FileReader, FileWriter
2
、是byte[]
:ByteArrayInputStream, ByteArrayOutputStream
3
、是Char[]: CharArrayReader, CharArrayWriter
4
、是String: StringBufferInputStream, StringReader, StringWriter
5
、网络数据流:InputStream, OutputStream, Reader, Writer
二、按是否格式化输出分:
1
、要格式化输出:PrintStream, PrintWriter
三、按是否要缓冲分:
1
、要缓冲:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter
四、按数据格式分:
1
、二进制格式(只要不能确定是纯文本的): InputStream, OutputStream
及其所有带Stream
结束的子类
2
、纯文本格式(含纯英文与汉字或其他编码方式);Reader, Writer
及其所有带Reader, Writer
的子类
五、按输入输出分:
1
、输入:Reader, InputStream
类型的子类
2
、输出:Writer, OutputStream
类型的子类
六、特殊需要:
1
、从Stream
到Reader,Writer
的转换类:InputStreamReader, OutputStreamWriter
2
、对象输入输出:ObjectInputStream, ObjectOutputStream
3
、进程间通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
4
、合并输入:SequenceInputStream
5
、更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader
决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):
首先,考虑最原始的数据格式是什么: 原则四
第二,是输入还是输出:原则五
第三,是否需要转换流:原则六第1
点
第四,数据来源(去向)是什么:原则一
第五,是否要缓冲:原则三 (特别注明:一定要注意的是readLine()
是否有定义,有什么比read, write
更特殊的输入或输出方法)
第六,是否要格式化输出:原则二
1.1
以字节为导向的
stream
以字节为导向的
stream
,表示以字节为单位从
stream
中读取或往
stream
中写入信息。以字节为导向的
stream
包括下面几种类型:
1) InputStream
:
1) ByteArrayInputStream
:把内存中的一个缓冲区作为
InputStream
使用
2) StringBufferInputStream
:把一个
String
对象作为
InputStream
3) FileInputStream
:把一个文件作为
InputStream
,实现对文件的读取操作
4) PipedInputStream
:实现了
pipe
的概念,主要在线程中使用
5) SequenceInputStream
:把多个
InputStream
合并为一个
InputStream
2) OutputStream
1) ByteArrayOutputStream
:把信息存入内存中的一个缓冲区中
2) FileOutputStream
:把信息存入文件中
3) PipedOutputStream
:实现了
pipe
的概念,主要在线程中使用
4) SequenceOutputStream
:把多个
OutStream
合并为一个
OutStream
1.2
以
Unicode
字符为导向的
stream
以
Unicode
字符为导向的
stream
,表示以
Unicode
字符为单位从
stream
中读取或往
stream
中写入信息。以
Unicode
字符为导向的
stream
包括下面几种类型:
1) InputStream
1) CharArrayReader
:与
ByteArrayInputStream
对应
2) StringReader
:与
StringBufferInputStream
对应
3) FileReader
:与
FileInputStream
对应
4) PipedReader
:与
PipedInputStream
对应
2) OutputStream
1) CharArrayWriter
:与
ByteArrayOutputStream
对应
2) StringWriter
:无与之对应的以字节为导向的
stream
3) FileWriter
:与
FileOutputStream
对应
4) PipedWriter
:与
PipedOutputStream
对应
以字符为导向的
stream
基本上对有与之相对应的以字节为导向的
stream
。两个对应类实现的功能相同,字是在操作时的导向不同。如
CharArrayReader
:和
ByteArrayInputStream
的作用都是把内存中的一个缓冲区作为
InputStream
使用,所不同的是前者每次从内存中读取一个字节的信息,而后者每次从内存中读取一个字符。
1.3
两种不现导向的
stream
之间的转换
InputStreamReader
和
OutputStreamReader
:把一个以字节为导向的
stream
转换成一个以字符为导向的
stream
。
2. stream
添加属性
2.1 "
为
stream
添加属性
"
的作用
运用上面介绍的
Java
中操作
IO
的
API
,我们就可完成我们想完成的任何操作了。但通过
FilterInputStream
和
FilterOutStream
的子类,我们可以为
stream
添加属性。
如果我们要往一个文件中写入数据,我们可以这样操作:
FileOutStream fs = new FileOutStream("test.txt");
然后就可以通过产生的
fs
对象调用
write()
函数来往
test.txt
文件中写入数据了。但是,如果我们想实现
"
先把要写入文件的数据先缓存到内存中,再把缓存中的数据写入文件中
"
的功能时,上面的
API
就没有一个能满足我们的需求了。但是通过
FilterInputStream
和
FilterOutStream
的子类,为
FileOutStream
添加我们所需要的功能。
2.2 FilterInputStream
的各种类型
2.2.1
用于封装以字节为导向的
InputStream
1) DataInputStream
:从
stream
中读取基本类型(
int
、
char
等)数据。
2) BufferedInputStream
:使用缓冲区
3) LineNumberInputStream
:会记录
input stream
内的行数,然后可以调用
getLineNumber()
和
setLineNumber(int)
4) PushbackInputStream
:很少用到,一般用于编译器开发
2.2.2
用于封装以字符为导向的
InputStream
1)
没有与
DataInputStream
对应的类。除非在要使用
readLine()
时改用
BufferedReader
,否则使用
DataInputStream
2) BufferedReader
:与
BufferedInputStream
对应
3) LineNumberReader
:与
LineNumberInputStream
对应
4) PushBackReader
:与
PushbackInputStream
对应
2.3 FilterOutStream
的各种类型
2.2.3
用于封装以字节为导向的
OutputStream
1) DataIOutStream
:往
stream
中输出基本类型(
int
、
char
等)数据。
2) BufferedOutStream
:使用缓冲区
3) PrintStream
:产生格式化输出
2.2.4
用于封装以字符为导向的
OutputStream
1) BufferedWriter
:与对应
2) PrintWriter
:与对应
3. RandomAccessFile
1)
可通过
RandomAccessFile
对象完成对文件的读写操作
2)
在产生一个对象时,可指明要打开的文件的性质:
r
,只读;
w
,只写;
rw
可读写