Java
Python前端运维数据库
Java
Java
  • 新特性
    • Record
    • Optional
  • 面向对象
    • 面向对象基础
    • 构造方法
    • 继承与多态
    • 接口
    • 修饰符
    • 代码块
    • 接口(Interface)
    • 枚举类
  • IO流
    • IO
      • 字节流
      • 字符流
      • 缓冲流
      • 转换流
      • 操作ZIP
      • File 对象
    • NIO
      • Channel和Buffer
      • 异步文件通道AsynchronousFileChannel
      • Selector
      • Path/Files/Pipe
  • 反射
  • 内存分配
  • 集合
    • 简介
    • List
    • Set
    • Map
    • EnumMap
  • 日期与时间
    • Date和Calendar
    • Java8 新时间 ✨
      • LocalDateTime
      • ZonedDateTime
      • Duration
    • 时间格式化
      • SimpleDateFromat
      • DateTimeFormatter ✨
    • Instant
    • 实践
  • 网络编程
    • IP 地址
    • 网络模型
    • TCP 编程
    • UDP 编程
    • HTTP 编程
  • 加密和安全
  • 并发编程
    • 多线程
    • 线程与进程的区别
    • 线程组和线程优先级
    • 线程池
    • 线程锁
  • 异步任务
    • Future
    • CompletableFuture
      • 开启异步任务
      • 串行任务方法
      • 并行任务方法
      • 任务结束方法
      • 异常处理方法
      • 查看状态方法
      • 设置任务结果方法
  • 执行系统命令
  • Stream 流
    • Stream 流的创建
    • Stream 流串行与并行
    • Stream 流中间操作
    • Stream 流终端操作
  • Lambda 表达式
    • Lambda 表达式简介
    • Lambda 表达式语法
    • 方法引用
  • String
  • StringBuffer
由 GitBook 提供支持
在本页
  • InputStreamReader
  • OutputStreamWriter

这有帮助吗?

  1. IO流
  2. IO

转换流

上一页缓冲流下一页操作ZIP

最后更新于5个月前

这有帮助吗?

在正常情况下,字节流可以对所有数据进行操作,但是有些时候在处理一些文本时我们要用到字符流,比如,查看文本时采用字符流更为方便,而在使用字节流时,当遇到中文及一些特殊字符时,就会出现乱码的情况,这是因为在UTF-8的字符编码下,中文占有3个字节。因此通常当我们在读取文本文件时,会选择使用字符流来处理。

除了使用字符流来读写文本文件时,我们还可以使用转换流,将字节流转换为字符流,从而解决中文UTF-8编码下的乱码问题。

所以 IO 流中提供了两种用于将字节流转换为字符流的转换流。

  • InputStreamReader用于将字节输入流转换为字符输入流。

  • OutputStreamWriter用于将字节输出流转换为字符输出流。

InputStreamReader

InputStreamReader类用于将字节输入流转换为字符输入流。如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK。

InputStreamReader类可与其它输入流一起使用。它被称为字节流和字符流之间的桥梁。

try (
        FileInputStream fileInputStream = new FileInputStream("test.txt");
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream)
) {
    int tmp;
    while ((tmp = inputStreamReader.read()) != -1) {
        System.out.print((char) tmp);
    }
} catch (IOException e) {
    System.out.println("文件读取失败");
}
try (
        // 读取文件的数据
        FileInputStream fileInputStream = new FileInputStream("input.txt");
        // 将字节流转换为字符流
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, StandardCharsets.UTF_8);
        // 字符流缓冲区
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
) {
    int tmp;
    while ((tmp = bufferedReader.read()) != -1) {
        System.out.print((char) tmp);
    }
} catch (IOException e) {
    e.printStackTrace();
}

键盘输入流转换为字符流

try (
        InputStreamReader inputStreamReader = new InputStreamReader(System.in);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
) {
    String line = null;
    while ((line = bufferedReader.readLine()) != null) {
        // 如果读取的字符串为“exit”,则程序退出
        if (line.equals("exit")) {
            System.exit(1);
        }
        // 打印读取的内容
        System.out.println("输入内容为:" + line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

OutputStreamWriter

OutputStreamWriter类用于将字符形式的数据转换为字节形式的数据。是字符流通向字节流的桥梁。如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK。

try (
        FileOutputStream fileOutputStream = new FileOutputStream("output.txt");
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8)
) {
    outputStreamWriter.write("hello word");
} catch (IOException e) {
    e.printStackTrace();
}

try (
        FileInputStream fileInputStream = new FileInputStream("input.txt");
        FileOutputStream fileOutputStream = new FileOutputStream("output.txt");
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, StandardCharsets.UTF_8);
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter)
) {
    int tmp;
    while ((tmp = bufferedReader.read()) != -1) {
        System.out.println((char) tmp);
        bufferedWriter.write(tmp);
    }
} catch (IOException e) {
    e.printStackTrace();
}
Drawing