Java 转换流

167 阅读1分钟

转换流

Snipaste_2022-12-23_22-09-20.png

  • 字符转换输入流:InputStreamReader

  • 字符转换输出流:OutputStreamWriter

  • 继承自Reader

  • 转换流是一种高级流,用来包装基本流

  • 转换流是字符流和字节流之间的桥梁

Snipaste_2022-12-23_21-27-54.png

  • 作用
    • 指定字符集读写数据(该方式在JDK11后被淘汰)
    • 字节流想要使用字符流中的方法

使用场景

  • 利用转换流按照指定字符编码读取(了解,在JDK11被淘汰)
//创建对象并指定字符编码
InputStreamReader isr = new InputStreamReader(new FileInputStream("..."), "GBK");
//读取数据
int ch;
while((ch = isr.read()) != -1) {
    System.out.print((char) ch);
}
//释放资源
isr.close();
  • JDK11的替代方案
    • FileReader添加了新的构造,可以直接传递字符编码
    • 在这个方法的底层,调用了父类(InputStreamReader)的构造方法
FileReader fr = new FileReader("...", Charset.forName("GBK"));
  • 利用转换流按照指定字符编码写出(了解,在JDK11被淘汰)
//创建转换流的对象
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("..."), "GBK");
//写出数据
osw.write("你好");
//释放资源
osw.close();
  • JDK11的替代方案
    • FileWriter添加了新的构造,可以直接传递字符编码
    • 在这个方法的底层,调用了父类(OutputStreamWriter)的构造方法
FileWriter fw = new FileWriter("...", Charset.forName("GBK"));
  • 将本地中的GBK文件,转成UTF-8
InputStreamReader isr = new InputStreamRead(new FileInputStream("..."), "GBK");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("..."), "UTF-8");

int b;
while((b = isr.read()) != -1) {
    osw.write(b);
}

osw.close();
isr.close();                                  
  • JDK11替代方案
FileReader fr = new FileReader("...", Charset.forName("GBK"));
FileWriter fw = new FileWriter("...", Charset.forName("UTF-8"));

int b;
while((b = fr.read()) != -1) {
    fw.write(b);
}

fw.close();
fr.close(); 
  • 利用字节流读取文件中的数据,每次读取一整行,而且不能出现乱码
InputStreamReader isr = new InputStreamReader(new FileInputStream("..."), "GBK");
BufferedReader br = new BufferedReader(isr);

String line;

while((line = br.readLine()) != null) {
    System.out.println(line);
}

br.close();