|
|
|
|
字节流 |
System.in
InputStream 流到程序,从流中read到数组 | FileInputStream |
|
FileterInputStream | BufferedInputStream | ||
DataInputStream | |||
PushBackInputStream | |||
LineNumberInputStream | |||
ObjectInputStream |
| ||
PipedInputStream[Thread] | |||
ByteArrayInputStream | |||
| |||
SequenceInputStream | |||
OutputStream 流出程序,从数组中write到流 | FileOutputStream |
| |
FileterOutputStream | BufferedOutputStream | ||
DataOutputStream | |||
PrintStream System.out,System.err | |||
ObjectOutputStream |
| ||
PipedOutputStream | |||
ByteArrayOutputStream | |||
| |||
字符流 U n i c o d e |
Reader | BufferedReader | LineNumberReader |
FilterReader | PushbackReader | ||
InputStreamReader | FileReader | ||
StringReader |
| ||
PipedReader | |||
CharArrayReader | |||
Writer
| BufferedWriter |
| |
FilterWriter | |||
OutPutStreamWriter | FileWriter | ||
StringWriter |
|
黑色为abstract类,绿色无对应,用过滤流来包装节点流
1.无论何时使用readLine(),都不应该使用DataInputStream,而应该使用BufferedReader。除了这一点,DataInputStream仍是I/O类库的首先。
2.字节流和字符流的转换:
字节流——字符流:InputStreamReader;
字符流——字节流:OutputStreamWriter;字符流中获取char[],转为string;调用string.getBytes()获取到byte[];通过ByteArrayInputStream和ByteArrayOutputStream得到字节流。
3.StringBufferInputStream、SequenceInputStream、PushBackInputStream,LineNumberInputStream没有对应输出流。
4.过滤流(装饰器):FilterInputStream及其子类;BufferedReader及其子类、FilterReader及其子类。对应的输出流也是。
5.字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的。字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容
6. public int read(byte[] b,int off,int len)throws IOException
Parameters:
b
- thebuffer into which the data is read.
off
- thestart offset in arrayb
atwhich the data is written.
len
- the maximum number of bytes to read.
Returns:
the total number of bytes read into the buffer, or-1
ifthere is no more data because the end of the stream has been reached.
7. ByteArrayOutputStream一般不用装饰,装饰类中没有其方法。
java IO 的一般使用原则 :
一、按数据来源(去向)分类:
1.是文件: FileInputStream,FileOutputStream; FileReader, FileWriter
2.是byte[] : ByteArrayInputStream, ByteArrayOutputStream
3.是Char[]: CharArrayReader, CharArrayWriter
4.是String: StringReader,StringWriter
5.网络数据流: InputStream, OutputStream; Reader, Writer
二、按是否格式化输出分:
PrintStream, PrintWriter
三、按是否要缓冲分:
BufferedInputStream, BufferedOutputStream;
BufferedReader, BufferedWriter
四、按数据格式分:
只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流
五、按输入输出分:
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 更特殊的输入或输出方法)