Java/IO

来源:互联网 发布:js prototype 继承 编辑:程序博客网 时间:2024/06/10 07:48

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

字节流

 

 

System.in

 

InputStream

流到程序,从流中read到数组

FileInputStream

 

 

FileterInputStream

BufferedInputStream

DataInputStream

PushBackInputStream

LineNumberInputStream

ObjectInputStream

 

PipedInputStream[Thread]

ByteArrayInputStream

StringBufferInputStreamdeprecated

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.StringBufferInputStreamSequenceInputStream、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 更特殊的输入或输出方法)




0 0
原创粉丝点击