1.概述
在本快速教程中,我们将学习几种将Java字节数组写入文件的不同方法。我们将从一开始就使用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);
}
我们将输出流打开到目标文件,然后我们可以简单地将byte[]
dataForWriting
传递给write
方法。请注意,我们在此处使用try-with-resources
块来确保在抛出IOException
情况下关闭OutputStream
。
3. Java NIO
Java NIO软件包是在Java 1.4中引入的,而NIO的文件系统API是在Java 7中的扩展。Java NIO使用缓冲并且是非阻塞的,而Java IO使用阻塞流。在java.nio.file
包中,用于创建文件资源的语法更加简洁。
我们可以使用Files
类将byte[]
写成一行:
Files.write(outputFile.toPath(), dataForWriting);
我们的示例要么创建文件,要么截断现有文件,然后将其打开以进行写入。我们还可以使用Paths.get(“path/to/file”)
或Paths.get(“path”, “to”, “file”)
来构造描述文件存储位置的Path
。 Path
是Java NIO原生表达路径的方式。
如果需要覆盖文件打开行为,我们还可以向write
方法提供OpenOption
。
4. Google Guava
Guava是Google提供的一种库,提供了多种类型的Java执行常见操作,包括IO。
让我们将番石榴导入我们的pom.xml
文件中:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.0-jre</version>
</dependency>
4.1 Guava Files
与Java NIO包一样,我们可以在一行中写入byte[]
:
Files.write(dataForWriting, outputFile);
Guava的Files.write
方法还带有可选的OptionOptions
并且使用与java.nio.Files.write
相同的默认值。
不过这里有一个陷阱:Guava Files.write
方法用@Beta
批注标记。根据文档,这意味着它可以随时更改,因此不建议在库中使用。
因此,如果我们正在编写一个库项目,则应考虑使用ByteSink
。
4.2。 ByteSink
我们还可以创建一个ByteSink
来写入我们的byte[]
:
ByteSink byteSink = Files.asByteSink(outputFile);
byteSink.write(dataForWriting);
ByteSink
是我们可以向其写入字节的目的地。它提供一个OutputStream
到目的地。
如果我们需要使用java.nio.files.Path
或提供特殊OpenOption
,我们可以得到我们的ByteSink
使用MoreFiles
类:
ByteSink byteSink = MoreFiles.asByteSink(outputFile.toPath(),
StandardOpenOption.CREATE,
StandardOpenOption.WRITE);
byteSink.write(dataForWriting);
5. Apache Commons IO
Apache Commons IO提供了一些常见的文件任务。
让我们导入commons-io的最新版本:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
现在,让我们使用FileUtils
类编写byte[]
:
FileUtils.writeByteArrayToFile(outputFile, dataForWriting);
FileUtils.writeByteArrayToFile
方法与我们使用的其他方法相似,我们为它提供一个File
,该File
代表我们想要的目标和正在写入的二进制数据。如果我们的目标文件或任何父目录不存在,则会创建它们。
六,结论
在这个简短的教程中,我们学习了如何使用纯Java和两个流行的Java实用程序库(Google Guava和Apache Commons IO)将byte[]
中的二进制数据写入文件。
0 评论