转换流包括两个:OutputStreamWriter和InputStreamReader
OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即将一个字符流的输出对象变为字节流输出对象。
InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即将一个字节流的输入对象变为字符流的输入对象。
InputStreamReader这个类是按照指定编码读取字节流将其解码为字符流 。也就是说它是先读取字节流,先将文件以字节流的方式转换为对象,再由该类解码为字符,具体如下:(下面是一个以按照UTF-8编码字节流从a.txt文件读入,再解码为字符流,最后以字符流写入到b.txt文件中)
FileWriter fileWriter = new FileWriter("C:\\myPicture\\b.txt");
FileInputStream fStream = new FileInputStream("C:\\myPicture\\a.txt");
//InputStreamReader isr =newInputStreamReader(in);这样创建对象,会用本地默认码表读取,将会发生错误解码的错误
InputStreamReader iStreamReader = new InputStreamReader(fStream,"UTF-8");//以指定的字符编码读取字节流读并解码为字符流
int len = 0;
char[] cbuf =new char[1024];
while((len=iStreamReader.read(cbuf))!=-1){
fileWriter.write(cbuf,0,len);
}
fileWriter.flush();
fStream.close();
iStreamReader.close();
fileWriter.close();
转换流和子类区别
发现有如下继承关系:
OutputStreamWriter: --子类FileWriter:
InputStreamReader:---子类FileReader;
父类和子类的功能有什么区别呢?
OutputStreamWriter和InputStreamReader是字符和字节的桥梁:也可以称之为字符转换流。字符转换流原理:字节流+编码表。
FileWriter和FileReader:作为子类,仅作为操作字符文件的便捷类存在。当操作的字符文件,使用的是默认编码表时可以不用父类,而直接用子类就完成操作了,简化了代码。
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));//默认字符集。
InputStreamReader isr = new InputStreamReader(new
FileInputStream("a.txt"),"GBK");//指定GBK字符集。
FileReader fr = new FileReader("a.txt");
这三句代码的功能是一样的,其中第三句最为便捷。
网友评论