Skip to content

转换流

转换流 主要用于处理字符数据的输入和输出。与字节流(InputStream和OutputStream)不同,转换流是基于字符的流,能够自动处理字符编码和解码。

字符编码

字符编码 就是一套自然语言的字符与二进制数之间的对应规则。

编码:按照某种规则,将字符存储到计算机中,称为编码。

解码:将存储在计算机中的二进制数按某种规则解析显示出来,称为解码。

字符集

字符集也叫编码表,是一个系统支持的所有字符的集合,包括各国文字、标点符号、图形符号、数字等。

计算机要准确的存储和识别各种字符集符号,需要进行字符编码,一套字符集必然至少有一套字符编码。常见字符集有 ASCII字符集GBK字符集Unicode字符集

字符集

InputStreamReader

InputStreamReader 继承自 Reader类,作用是将字节流转换为字符流。它是字符流和字节流之间的桥梁,允许你将字节数据(如文件或网络数据)读取并转换为字符数据。

构造函数:

构造函数描述
InputStreamReader(InputStream in)创建字符输入流,默认编码 UTF-8
InputStreamReader(InputStream in, String charsetName)创建字符输入流,指定字符串格式编码(如UTF-8,GBK),可忽略大小写
InputStreamReader(InputStream in, Charset cs)创建字符输入流,使用 Charset 字符集指定编码

由于其继承自 Reader 类,所以常用方法和 Reader 类一致。

java
public static void main(String[] args) throws IOException {
  // 默认编码是UTF-8
  InputStreamReader isr 
    = new InputStreamReader(new FileInputStream("E:\\StudyCode\\1.txt"));
  
  // 可以手动写入字符串编码"UTF-8",但是编辑器会有更好的提示,使用 StandardCharsets.UTF_8
  InputStreamReader isr
    = new InputStreamReader(new FileInputStream("E:\\StudyCode\\1.txt"), StandardCharsets.UTF_8);
  int read = isr.read();
  System.out.println((char) read);
  isr.close();
}

但是,为了能够有更好的效率,推荐将 InputStreamReader 包装在 BufferedReader 中,如:

java
@Test
public void test1() throws IOException {
  FileInputStream fis = new FileInputStream("E:\\StudyCode\\1.txt");
  BufferedReader br = new BufferedReader(new InputStreamReader(fis, StandardCharsets.UTF_8));

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

  br.close();
}

OutputStreamWriter

OutputStreamWriter 继承自 Writer 类,作用是将字符流转换为字节流。它允许将字符数据转换为字节数据,并手动指定编码类型。

构造函数:

构造函数描述
OutputStreamWriter(OutputStream out)创建字符输出流,默认编码为 UTF-8
OutputStreamWriter(OutputStream out, String charsetName)创建字符输出流,指定字符串格式编码(如UTF-8,GBK),可忽略大小写
OutputStreamWriter(OutputStream out, Charset cs)创建字符输出流,使用 Charset 字符集指定编码

由于其继承自 Writer 类,所以常用方法与 Writer 类一致。

java
@Test
public void test() throws IOException {
  // 默认编码UTF-8
  OutputStreamWriter osw 
  	= new OutputStreamWriter(new FileOutputStream("E:\\StudyCode\\1.txt"));

  // 使用编码为"GBK"
  OutputStreamWriter osw
    = new OutputStreamWriter(new FileOutputStream("E:\\StudyCode\\1.txt"), "GBK");

  osw.write("落霞与孤鹜齐飞,\n");
  osw.write("秋水共长天一色。");
  osw.close();
}

但是,为了能够有更好的性能,推荐将 OutputStreamWriter 包装在 BufferedReader 中,如:

java
@Test
public void test1() throws IOException {
  FileOutputStream fos = new FileOutputStream("E:\\StudyCode\\1.txt");
  BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos, StandardCharsets.UTF_8));

  bw.write("斯是陋室,\n");
  bw.write("为吾德馨。");

  bw.close();
}

Released under the MIT License.