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