Java IO 流知识总结

一、文件字节输入流:读取文件数据的步骤

  1. 一次性读取完全部字节
  2. 可以定义与文件一样大的字节数组读取,也可以使用官方 API(如 InputStream.readAllBytes() 等)

二、如何用字节输入流读取中文且输出不乱码?

  1. 一次性读取完全部字节
  2. 可以定义与文件一样大的字节数组读取,也可以使用官方 API
  3. 读取后需按正确的字符编码(如 UTF-8)将字节数组转为字符串再输出

字节流本身不识别字符编码,乱码通常出现在「字节 → 字符串」的解码环节,而非读取环节。


三、一次性将全部文件数据读入字节数组是否有问题?

优点 风险
操作简单,适合小文件 文件过大时,定义与文件等大的字节数组可能导致 内存溢出(OOM)

建议: 大文件应使用缓冲流分块读取,而非一次性加载。


四、字节流与文件复制

字节流非常适合做文件的复制操作:

  • 任何文件的底层都是字节
  • 字节流做复制时,是一字不漏地转移全部字节
  • 只要复制前后文件格式一致,复制结果就是正确的

五、字符输出流的注意事项

字符输出流写出数据后,必须刷新流或关闭流,写出去的数据才会真正生效。

方法 说明
public void flush() throws IOException 刷新流:将内存中缓存的数据立即写到目标(如文件)中
public void close() throws IOException 关闭流;关闭操作内部包含刷新

六、Commons-IO 框架

Commons-IO 是 Apache 开源基金会提供的一组 IO 操作小框架,目的是提高 IO 流的开发效率。

FileUtils 类(部分方法)

方法 说明
public static void copyFile(File srcFile, File destFile) 复制文件
public static void copyDirectory(File srcDir, File destDir) 复制文件夹
public static void deleteDirectory(File directory) 删除文件夹
public static String readFileToString(File file, String encoding) 按指定编码读取文件内容为字符串
public static void writeStringToFile(File file, String data, String charsetName, boolean append) 按指定编码将字符串写入文件(append 为是否追加)

IOUtils 类(部分方法)

方法 说明
public static int copy(InputStream inputStream, OutputStream outputStream) 从输入流复制到输出流(字节流)
public static int copy(Reader reader, Writer writer) 从字符输入流复制到字符输出流
public static void write(String data, OutputStream output, String charsetName) 按指定字符集将字符串写入输出流

更多推荐