1. 概述

在本篇文章中,我们将介绍几种将 Java 中的 byte[] 数组写入文件的方式。从最基础的 Java IO 开始,然后过渡到 Java NIO,最后还会使用 Google Guava 和 Apache Commons IO 这两个常见的工具库来演示实现方式。

2. 使用 Java IO

Java 的 IO 包从 JDK 1.0 就开始存在了,它提供了一组用于读写数据的类和接口。

我们可以使用 FileOutputStream 将字节数组写入文件:

File outputFile = tempFolder.newFile("outputFile.jpg");
try (FileOutputStream outputStream = new FileOutputStream(outputFile)) {
    outputStream.write(dataForWriting);
}

这段代码很简单粗暴:打开一个输出流,然后调用 write() 方法把 byte[] 数据写进去。注意这里用了 try-with-resources 语法,确保即使抛出 IOException 也能自动关闭流,避免资源泄露。

3. 使用 Java NIO

Java NIO 包是在 Java 1.4 中引入的,而文件系统相关的 API(即 NIO.2)则是在 Java 7 中作为扩展加入的。⚠️ NIO 使用缓冲机制并且是非阻塞的,而传统的 IO 是阻塞式的流操作。

使用 NIO 的 Files 类可以更简洁地完成写入操作:

Files.write(outputFile.toPath(), dataForWriting);

这个方法会创建新文件或覆盖已有文件。如果需要自定义打开文件的行为,可以通过传入 OpenOption 参数进行控制。

另外,我们也可以使用 Paths.get("path/to/file") 或者 Paths.get("path", "to", "file") 来构建 Path 对象,这是 NIO 中表示路径的标准方式。

4. 使用 Google Guava

Guava 是 Google 提供的一个功能强大的 Java 工具库,其中也包含了对 IO 操作的支持。

首先,在 pom.xml 中引入 Guava 依赖:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

4.1. Guava Files 工具类

与 Java NIO 类似,Guava 也可以一行代码搞定写入:

Files.write(dataForWriting, outputFile);

不过要注意⚠️:**Guava 的 Files.write 方法被标记为 @Beta**,这意味着它的行为可能会在未来版本中发生变化,不适合用在对外发布的库项目中。

4.2. 使用 ByteSink

如果你正在开发的是一个库项目,并且想规避 @Beta 风险,推荐使用 ByteSink

ByteSink byteSink = Files.asByteSink(outputFile);
byteSink.write(dataForWriting);

ByteSink 表示一个可以写入字节的目标位置,它内部会提供一个 OutputStream

如果需要使用 java.nio.file.Path 或者指定特殊的打开选项,可以通过 MoreFiles 获取 ByteSink

ByteSink byteSink = MoreFiles.asByteSink(outputFile.toPath(), 
    StandardOpenOption.CREATE, 
    StandardOpenOption.WRITE);
byteSink.write(dataForWriting);

5. 使用 Apache Commons IO

Apache Commons IO 是另一个非常流行的 Java 工具库,提供了很多实用的文件处理功能。

同样先添加 Maven 依赖:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.15.1</version>
</dependency>

然后就可以使用 FileUtils 轻松写入字节数组:

FileUtils.writeByteArrayToFile(outputFile, dataForWriting);

该方法会在目标文件或其父目录不存在时自动创建它们,这一点比原生 IO 更加友好。

6. 总结

在这篇文章中,我们展示了多种将 byte[] 写入文件的方法:

方式 特点
Java IO 基础、稳定、需手动管理流
Java NIO 简洁、非阻塞、推荐用于现代项目
Guava 语法简洁,但部分 API 带有 @Beta 标记
Apache Commons IO 易用性高,适合快速开发

📌 如果你是在写业务代码或者小工具,建议直接上 Files.write()FileUtils.writeByteArrayToFile();如果是做库开发,谨慎使用 Guava 的 @Beta 接口,考虑封装成 ByteSink 形式。

一如既往,所有示例代码都可以在 GitHub 上找到:https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-io-3


原始标题:Writing byte[] to a File in Java