**
java I/O流:字节流和字符流(概要及其方法)
**
IO流按照操作数据的不同可分为字节流和字符流。按照数据传输方向的不同又可以分为输入流和输出流。程序从输入流中读取数据,向输出流中写入数据。
在IO包中,字节流的输入/输出流分别用java.io.Reader和java.io.Writer表示。
- [ 一] 字节流:
针对字节输入、输出提供的一系列流。 文本、图片、音频和视频都是以字节的形式存在的,因此要对这些内容进行传输就要使用字节流。
两个抽象类:InputStream(字节输入流 )、OutputStream(字节输出流)。 它们是字节流的两个顶级父类,字节输入流都是InputStream的子类,字节输出流都是OutputStream的子类。
- InputStream的常用方法:
int read() : 从输入流中读取数据的下一个字节。
int read(byte[] b): 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。
int read(byte[]b , int off,int len): 从输入流中读取若干字节,把它们保存到参数b指定的字节数组中,off指定字节数组开始保存数据的起始下标,len表示读取的字节数目
void close() : 关闭此输入流并释放与该流关联的所有系统资源。
- OutputStream的常用方法:
void write(int b) : 将指定的字节写入次输出流。
void write(byte[] b) : 将b.length个字节从指定的byte数组写入此输出流。
void write(byte[] b , int off ,int len) : 将指定byte数组中从偏移量off开始的len个字节写入此输出流。
void flush() : 刷新此输出流并强制写出所有缓冲的输出字节。
void close(): 关闭此输出流并释放与该流关联的所有系统资源。
注意: 输出主要方法是write 而输入的主要方法是read。
- 字节流操作文件
针对文件的读写,JDK专门提供了两个类 : FileInputStream和 FileOutputStream 。它们分别包括了一套是所有输入与输出需要使用的方法,可以完成最基本的读取与写出功能。
通过FileOutputStream 向一个已经存在的文件中写入数据,该文件中的数据会被清空,如果希望追加数据,只需要在字节输入流的末尾追加一个参数值true即可。
(注意:一旦遇到I/O异常 ,IO流的close方法将无法得到执行,流对象所占用的系统资源
将无法释放,因此,为了保证IO流的close()方法必须执行,通常将关闭流的操作写在finally代码块里。)
字节流缓冲区:为了提高单个字节的读、写效率,可以使用字节流缓冲区,即定义一个字节数组作为缓冲区,复制文件时,可以将读取的单个字节保存到字节数组中,然后将字节数组中的数据一次性写入文件中。
字节缓冲流:提高读写效率除了使用字节流缓冲区,还可以使用java.io包中自带缓冲功能的字节缓冲流,它们分别是BufferedInputStrem 和BufferedOutputStream。这两个流在实例化的时候需要接受InputStream和OutputStream类型的对象作为参数。
例如:
BufferedInputStream bufferInput = new BudderedInputStream(new FileInputStream("source\河马.jpg"));
BufferedOutputStream bufferOutput = new BudderedOutputStream(new FileOutputStream("source\河马.jpg"));
while((lenth = bufferInput.read()) != -1){
bufferOutput.write(lenth);
}
这两者提高程序指向效率几乎相同。
- [ 二] 字符流
字符流有两个抽象的顶级父类: Reader 和Writer 。 Reader是字符输入流,从某个源设备读取字符; Writer是字符输出流,用于向某个目标设备写入字符。
在程序开发中,经常需要读取文本文件的内容,如果要从文件中直接读取字符,便可以使用字符输入流FileReader,通过此流可以从关联的文件中读取一个或一组字符。
FileReader / FileWriter 用于读/写文件, BufferedReader 和 BufferedWriter 是具有缓冲功能的流 使用它们可以提高读、写效率。(注意:字符缓冲流内部使用了缓冲区,字符写入缓冲区时,当缓冲区填充不下或者调用close()方法时,缓冲区的字符才会一次性写入目标文件中。因此在循环结束时一定要调用close()方法,否则很容易会导致缓冲区的部分数据无法写入目标文件中。)
字符流Reader的常见方法:
read():读取单个字符。
read(char[] buf) :将字符读入数组。
read(char[] buf, int off, int len) : 将字符读入数组的某一部分。
read(CharBuffer target) :试图将字符读入指定的字符缓冲区。
flush() :刷新该流的缓冲。
close() :关闭此流。(需要先刷新它)
字符输出流Writer主要方法:
write(char[] buf) :写入字符数组。
write(char[] buf, int off, int len) :写入字符数组的某一部分。
write(int c) :写入单个字符。
write(String str) :写入字符串。
write(String str, int off, int len) :写入字符串的某一部分。
flush() :刷新该流的缓冲。
close() :关闭此流。(需要先刷新它)
- [ 三] 转换流
字节流和字符流相互的转换,java.io包中提供了两个类可以将字节流转换为字符流 : InputStreamReader 和 OutputStreamWriter。
使用转换流可以在一定程度上避免乱码,还可以指定输入输出所使用的字符集。
OutputStreamWriter 是Writer的子类,将一个字节输出流转换成字符输出流,方便直接写入字符。
InputStreamReader 是Reader 的子类,讲一个字节输出流转换成字符输入流,方便直接读取字符。
一般为了提高读/写效率,常通过字符缓冲流实现转换的操作。(注意:在使用转换流时,只能针对操作文本文件的字节流进行转换,如果字节流操作的是图片或者音频,此时转换为字符流就会造成数据丢失。)
OutputStreamWriter的常见方法:
flsh():刷新该流的缓冲
close():关闭此流,关闭前需要刷新
getEncoding():获取此流使用的字符编码的名称。
(1)write():write(char[] ,int offset ,int length):写入字符数组的某一部分
(2)write(String ,int offset ,int length):写入字符串的某一部分
(3)write(String ):写入单个字符
InputStreamReader的常见方法:
close(): 关闭此流
getEncoding(): 获取此流使用的字符编码的名称
ready(): 判断此流是否已经准备好用于读取
read(): 读取单个字符。
read(char[],int offset ,int length),将字符读入数组的某一部分