转换流
顾名思义,就是可以把字符与字节的流相互转换
OutputStreamWriter类
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节。它的作用的就是,将字符串按照指定的编码表转成字节,在使用字节流将这些字节写出去
/**
* 字符转字节,并指定编码
*/
public static void test1() throws IOException {
// 创建与文件关联的字节输出流对象
FileOutputStream fos = new FileOutputStream("e:\\e.txt");
// 创建可以把字符转成字节的转换流对象,并指定编码
OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8");
// 调用转换流,把文字写进去,其实是写到转换流的缓冲区中
// 写入缓冲区
osw.write("OutputStreamWriter 是字符流通向字节流的桥梁");
// 关闭资源
osw.close();
}
其实在OutputStreamWriter流中维护自己的缓冲区,当我们调用OutputStreamWriter对象的write方法时,会拿着字符到指定的码表中进行查询,把查到的字符编码值转成字节数存放到OutputStreamWriter缓冲区中。然后再调用刷新功能,或者关闭流,或者缓冲区存满后会把缓冲区中的字节数据使用字节流写到指定的文件中
InputStreamReader类
它使用指定的字符编码表读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集
/**
* 字节转字符,并指定编码
*/
public static void test2() throws IOException {
// 创建读取文件的字节流对象
InputStream in = new FileInputStream("e:\\e.txt");
// 创建转换流对象
//InputStreamReader isr = new InputStreamReader(in);这样创建对象,会用本地默认码表读取,将会发生错误解码的错误
InputStreamReader isr = new InputStreamReader(in, "utf-8");
// 使用转换流去读字节流中的字节
int ch = 0;
while ((ch = isr.read()) != -1) {
System.out.println((char)ch);
}
// 关闭资源
isr.close();
}
注意:在读取指定的编码的文件时,一定要指定编码格式,否则就会发生解码错误,而发生乱码现象
缓冲流
读取数据量大的文件时,读取的速度会很慢,很影响我们程序的效率,那么,我想提高速度,怎么办? Java中提高了一套缓冲流,它的存在,可提高IO流的读写速度, 缓冲流,根据流的分类分类字节缓冲流与字符缓冲流
字节缓冲流
它们的内部都包含了一个缓冲区,通过缓冲区读写,就可以提高了IO流的读写速度
字节缓冲流根据流的方向,共有2个
-
写入数据到流中,字节缓冲输出流 BufferedOutputStream
-
读取流中的数据,字节缓冲输入流 BufferedInputStream
字节缓冲输出流 BufferedOutputStream
通过字节缓冲流,进行文件的读写操作 写数据到文件的操作