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 可读写