转换流与其子类之间的区别
发现有如下继承关系:
Writer 字符输出流
OutputStreamWriter 转换流(字符流—>字节流)(属于字符输出流, 可以指定字符编码表,用来写入数据到文件)
FileWriter 操作文件中字符输出流,采用默认的字符编码表
Reader 字符输入流
InputStreamReader: 转换流(字节流à字符流)(属于字符输入流,可以指定字符编码表,用来从文件中读数据)
FileReader操作文件中字符输入流,采用默认的字符编码表
父类和子类的功能有什么区别呢?
OutputStreamWriter和InputStreamReader是字符和字节的桥梁:也可以称之为字符转换流。字符转换流原理:字节流+编码表。
FileWriter和FileReader:作为子类,仅作为操作字符文件的便捷类存在。当操作的字符文件,使用的是默认编码表时可以不用父类,而直接用子类就完成操作了,简化了代码。
InputStreamReader isr = newInputStreamReader(new FileInputStream("a.txt"));//默认字符集。
InputStreamReader isr = newInputStreamReader(new FileInputStream("a.txt"),"GBK");//指定GBK字符集。
FileReader fr = newFileReader("a.txt");
这三句代码的功能是一样的,其中第三句最为便捷。
注意:一旦要指定其他编码时,绝对不能用子类,必须使用字符转换流。什么时候用子类呢?
条件:
1、操作的是文件。2、使用默认编码。
总结:
字节--->编码表--->字符: 看不懂的--->看的懂的。 需要读。输入流。InputStreamReader
字符--->编码表--->字节: 看的懂的--->看不懂的。 需要写。输出流。OutputStreamWriter
举个例子
现有一字符串:”我爱Java”。将该字符串保存到当前项目根目录下的a.txt文件中。
要求:使用utf8编码保存。
public staticvoid main(String[] args) throws IOException{
// 要保存的字符串
String content= "我爱Java";
// 创建字节输出流对象
FileOutputStream fos = new FileOutputStream("a.txt");
// 创建转换输出流对象
OutputStreamWriter osw = newOutputStreamWriter(fos, "utf8");
// 调用方法写出数据
osw.write(content);
// 关闭流释放资源
osw.close();
}
}
在使用中的注意事项:
在读取指定的编码的文件时,一定要指定编码格式,否则就会发生解码错误,而发生乱码现象。