一. 流:
输入流(inputstream): 一个可以读取字节序列的对象;
输出流(outputstream): 一个可以写入字节序列的对象;
两大主要基类:
面向单字节: InputStream , OutputStream
面向双字节: Reader , Writer
对应的抽象方法: read() , write();
说明:
1.双字节的I/O主要面向Unicode编码设计的。
2.abstract int read():
该方法读取一个字节,并将结果返回;如果读到结束,返回-1。
例如: FileInputStream 中 read()方法将从文件中读取一个字符返回;
Sytem.in 是一个预定的InputStream的子类的对象,可以接受键盘的输入;
InputStream或Reader的子类可以覆盖read()方法,自定义读入的方式。
3.abstract void write():
将字节写入到指定的输出位置。
4. 不论是read方法还是write方法都能阻塞一个线程知道字节被真正地读入或写入。
这意味着如果不能立即被读取或写入,java就会挂起这个调用的线程。
5. 当完成对一个流的读取或写入后,就应该调用close()进行关闭. 关闭一个输出流也可以用刷新( flush() )输出流占用的缓冲区(即临时存储在缓冲区中等待形成较大数据包后再发送的那些字符)将它们发送出去。
6. 基本的read(), write()
Java.io.InputStream 的主要API
Ø abstract int read()
读取一个字节的数据并将其返回,当读到流的结尾的时候,返回-1;
Ø int read(byte[] b)
将数据读到一个字节数组并返回读取的字节的实际数目,当达到流的结尾的时候,返回-1
最多读取b.length个字节
Ø int read(byte[] b , int off, len)
同上,增加条件限制。从数组b的off位置开始读取,读取最大长度为len.
long skip(long n)
在输入流中跳过n个字节。返回实际跳过的字节数(如果到达末尾,返回可能小于n)
Ø int available()
返回可用的未阻塞的字节数
Ø void close()
关闭输入流
Java.io.OutputStream 主要API
Ø abstract void write(int n)
写入一个字节的数据;
Ø void write(byte[] b)
写入数组b的数据;
Ø void write(byte[] b,int off,int len)
写入数组b中某一范围的数据;
Ø void close()
刷新并关闭输出流;
Ø void flush()
刷新输出流,即将缓冲区中的所有数据发送到目的地.
二. 常用的JAVA I/O类
Ø InputStream :抽象类,是所有字节输入流的超类
子类:
n ByteArrayInputStream:
把字节数组转换为输入流,把内存中的一个缓冲区作为InputStream 使用
n FileInputStream:
从文件中读取数据,把一个文件作为InputStream,实现对文件的读取操作
n PipedInputStream :
连接一个PipedInputStream,实现了pipe的概念,主要在线程中使用
n SequenceInputStream :
把几个输入流转换为一个输入流,把多个InputStream合并为一个InputStream
n ObjectInputStream:
对象输入流
n FilterInputStream :
装饰器,具有扩展其他输入流的功能
Ø OutputStream:抽象类,是所有字节输出流的超类
子类:
n ByteArrayOutputStream :
向字节数组(内存的缓冲区)中写数据,把信息存入内存中的一个缓冲区中
n FileOutputStream :
向文件中写数据,把信息存入文件中
n PipedInputStream :
向管道中输出数据,与PipedInputStream搭配使用,实现了pipe的概念,主要在线程中使用
n ObjectOutputStream:
对象输出流
n FilterOutputStream:
装饰器,扩展其他输出流的功能
Ø 字符流: (处理字符流最大的问题是进行字符编码的转换)
Reader : 读取字符流的抽象类
子类:
n CharArrayReader:
适配器,把字符数组转换为Reader,从字符数组中读取字符,与ByteArrayInputStream对应
n BufferedReader :
装饰器,为其他的Reader提供缓冲区。
n LineNumberReader:
装饰器,为其他的Reader提供缓冲区,并且可以跟踪字符输入流中的行号
n StringReader:
适配器,把字符串转换为Reader,从字符串中读取字符
n PipedReader:
连接一个PipedWriter
n FilterReader:
装饰器,扩展其他的Reader的功能
n InputStreamReader :
适配器,把InputStream转换为Reader,可以指定数据源的字符编码
n FileReader:
从文件中读取字符
Ø Writer : 写入字符流的抽象类
子类:
n CharArrayWriter :
适配器,把字符数组转换为Witer,向字符数组中写字符
n BufferedWriter;
装饰器,为其他的Writer提供写缓冲区
n StringWriter:
适配器,把StringBuffer转换为Writer,向StringBuffer中写字符
n PipedWriter:
连接一个PipedReader
n FilterWriter:
装饰器,扩展其他的Writer的功能
n PringWriter:
装配器,输出格式化数据
n OutputStreamWriter:
适配器,把OutputStream 转换Writer ,可以指定数据汇的字符编码
n FileWriter:
向文件中写字符
最后心得,在用I/O的时候,应该先确认好字符的类型,选择适合的I/O,然后确认该类的构造参数。比如BufferInputStream,用来处理防止每次读取时候都得进行写操作,构造参数是InputStream。总之一句话:定字符类型,定构造参数。