Latin-1: 拉丁字符. 没有中文. 每个字符由1个byte组成
java.io.Reader
|_ InputStreamReader: 转换字符输入流 读 char char[] byte -> char 97 -> 'a'
|_ FileReader byte -UTF-8-> char
java.io.Writer char char[] String
|_ OutputStreamWriter: 转换字符输出流 char char[] String -> byte
|_ FileWriter char -UTF-8-> byte
FileReader=InputStreamReader+FileInputStream, 只不过固定按照IDEA中的UTF-8来将读取的字节转换为字符
FileWriter=OutputStreamWriter+FileOutputStream, 只不过固定按照IDEA中的UTF-8来将写出的字符转换为字节
字符流 = 字节流 + 编码表
转换流InputStreamReader, OutputStreamWriter在读写时, 可以指定按照哪个编码表来进行转换
java.io.OutputStreamWriter类: 输出转换流. 字符流通往字节流的桥梁
// 构造方法
OutputStreamWriter(OutputStream out): 使用默认编码表创建转换流
OutputStreamWriter(OutputStream out, String charsetName): 使用指定编码表创建转换流
write('a') -> "GBK" -> 97 OutputStream out -> 文件
// 使用默认UTF-8
OutputStreamWriter o = new OutputStreamWriter(new FileOutputStream("a.txt"));
// 使用指定的GBK
OutputStreamWriter o = new OutputStreamWriter(new FileOutputStream("a.txt"), "GBK");
o.write("你") -> GBK -> 7676 -> 文件
写数据: 字符流 -------> 字节流
java.io.InputStreamReader类: 输入转换流. 字节流通往字符流的桥梁
// 构造方法
InputStreamReader(InputStream in): 使用默认编码表创建转换流
InputStreamReader(InputStream in, String charsetName): 使用指定编码表创建转换流
// 使用默认UTF-8
InputStreamReader r = new InputStreamReader(new FileInputStream("a.txt"));
// 使用指定的GBK
InputStreamReader r = new InputStreamReader(new FileInputStream("a.txt"), "GBK");
bbb int ch = r.read() <------GBK----------- 字节byte 989898
r.read(chs)
读数据: 字符流 <------ 字节流
[Java] 纯文本查看 复制代码
public class Test {
public static void main(String[] args) throws IOException {
// 创建输入转换流
InputStreamReader isr = new InputStreamReader(new FileInputStream("day10\\我是GBK文
件.txt"), "GBK");
// 创建输出转换流
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day10\\我是UTF_8文
件.txt"), "UTF-8");
// 循环读写: 一次读写一个字符char
int ch;
while ((ch = isr.read()) != -1) {
// 读到的字符, 经过InputStreamReader已经按照GBK转换为正确的"你好"
// 接下来交给OutputStreamWriter写出去, 写的时候会按照UTF-8转换为UTF-8的byte
osw.write(ch);
}
// 刷新并释放资源
isr.close();
osw.close();
}
}