1. Обзор
В этом кратком руководстве мы изучим несколько различных способов записи массива байтов Java в файл. Мы начнем с самого начала, используя пакет Java IO. Далее мы рассмотрим пример с использованием Java NIO. После этого мы будем использовать Google Guava и Apache Commons IO.
2. Java ввод/вывод
Пакет Java IO существует со времен JDK 1.0 и предоставляет набор классов и интерфейсов для чтения и записи данных.
Давайте используем FileOutputStream
для записи изображения в файл:
File outputFile = tempFolder.newFile("outputFile.jpg");
try (FileOutputStream outputStream = new FileOutputStream(outputFile)) {
outputStream.write(dataForWriting);
}
Мы открываем выходной поток в наш целевой файл, а затем мы можем просто передать наш byte[]
dataForWriting
в метод записи
. Обратите внимание, что здесь мы используем блок try -with-resources
, чтобы убедиться, что мы закрываем OutputStream
в случае возникновения исключения IOException
.
3. Java НИО
Пакет Java NIO был представлен в Java 1.4, а API файловой системы для NIO был представлен как расширение в Java 7. Java NIO использует буферизацию и не блокирует, тогда как Java IO использует блокирующие потоки. Синтаксис создания файловых ресурсов более краток в пакете java.nio.file
.
Мы можем написать наш byte[]
в одну строку, используя класс Files :
Files.write(outputFile.toPath(), dataForWriting);
В нашем примере либо создается файл, либо усекается существующий файл и открывается для записи. Мы также можем использовать Paths.get("путь/к/файлу")
или Paths.get("путь", "к", "файл")
для создания пути
, который описывает, где будет храниться наш файл. Путь
— это собственный способ выражения путей в Java NIO.
Если нам нужно переопределить поведение при открытии файла, мы также можем предоставить OpenOption
методу записи
.
4. Google Гуава
Guava — это библиотека от Google, которая предоставляет множество типов для выполнения общих операций в Java, включая ввод-вывод.
Давайте импортируем Guava в наш файл pom.xml
:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
4.1. Файлы гуавы
Как и в случае с пакетом Java NIO, мы можем записать наш byte[]
в одну строку:
Files.write(dataForWriting, outputFile);
Метод Guava Files.write
также принимает необязательный OptionOptions
и использует те же значения по умолчанию, что и java.nio.Files.write
.
Однако здесь есть одна загвоздка: метод Guava Files.write
помечен аннотацией @Beta
. Согласно документации , это означает, что он может измениться в любое время, поэтому его не рекомендуется использовать в библиотеках.
Итак, если мы пишем проект библиотеки, мы должны рассмотреть возможность использования ByteSink
.
4.2. БайтСинк
Мы также можем создать 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.11.0</version>
</dependency>
Теперь давайте напишем наш byte[]
с помощью класса FileUtils
:
FileUtils.writeByteArrayToFile(outputFile, dataForWriting);
Метод FileUtils.writeByteArrayToFile
похож на другие методы, которые мы использовали, в том, что мы даем ему файл
, представляющий желаемое место назначения, и двоичные данные, которые мы записываем. Если наш целевой файл или любой из родительских каталогов не существует, они будут созданы.
6. Заключение
В этом коротком руководстве мы узнали, как записывать двоичные данные из byte[]
в файл, используя обычную Java и две популярные служебные библиотеки Java: Google Guava и Apache Commons IO.
Как всегда, код примера доступен на GitHub .