Java IO 流进阶笔记

Java IO 流进阶笔记

转换流

程序中操作的是字符流(转码后),但与文件交互时底层仍是字节流。

  • InputStreamReader(InputStream in, "UTF-8") 会把字节流转换为字符流。比如文件中有中文“我”,如果直接用 FileInputStream.read() 逐字节读取并强转 char,会出现乱码,因为 UTF-8 下一个中文通常由 3 个字节组成;而用 InputStreamReader 读取时,会先完成解码再返回字符。
  • 同理,向文件写入“我”时,底层需要写入 3 个字节;这个编码过程由 OutputStreamWriter 完成,它会把字符转换后再写入 OutputStream

缓冲流

缓冲流的核心作用是提升读写效率:读时先把文件数据读入内存缓冲区,写时先写入缓冲区,缓冲区满后再批量写入文件系统。

  • 字节缓冲流 BufferedInputStream(InputStream in)
  • 字符缓冲流: readLine() newLine();
  • 字符缓冲流:readLine()newLine()

使用缓冲流写文件时,如果数据未填满缓冲区,需要手动调用 flush()