Рубрики
Без рубрики

Запись байта[] в файл на Java

Когда нам нужно записать массив байтов в файл на Java, есть несколько вариантов. Мы можем использовать либо встроенные API, либо несколько общих библиотек.

Автор оригинала: Amy DeGregorio.

1. Обзор

В этом кратком руководстве мы рассмотрим несколько различных способов записи массива байтов Java в файл. Мы начнем с самого начала, используя пакет Java IO. Далее мы рассмотрим пример использования Java NIO. После этого мы будем использовать Google Guava и Apache Commons IO.

2. Java IO

Пакет ввода-вывода Java существует с JDK 1.0 и предоставляет набор классов и интерфейсов для чтения и записи данных.

Давайте используем FileOutputStream для записи изображения в файл:

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

Мы открываем outputstream для вашего целевого файла, а затем мы можем просто передать byte [] | данные Для записи в метод write . Обратите внимание, что мы используем блок try-with-resources здесь, чтобы убедиться, что мы закрываем OutputStream в случае возникновения IOException .

3. Java NIO

Пакет Java NIO был представлен в Java 1.4, а API файловой системы для NIO был представлен как расширение в Java 7. Java NIO использует буферизацию и не блокирует, в то время как Java IO использует блокирующие потоки. Синтаксис создания файловых ресурсов более лаконичен в пакете java.nio.file .

Мы можем записать наш байт[] в одну строку, используя класс Files :

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

Наш пример либо создает файл, либо усекает существующий файл и открывает его для записи. Мы также можем использовать Paths.get(“path/to/file”) или Paths.get(“path”, “to”, “file”) для построения Path , описывающего, где будет храниться ваш файл. Path – это собственный способ выражения путей Java NIO.

Если нам нужно переопределить поведение открытия файла, мы также можем предоставить методу write опцию Open.

4. Google Guava

Guava-это библиотека Google, которая предоставляет множество типов для выполнения общих операций в Java, включая ввод-вывод.

Давайте импортируем Гуаву в наш pom.xml файл:


    com.google.guava
    guava
    30.0-jre

4.1. Файлы Гуавы

Как и в случае с пакетом Java NIO, мы можем записать ваш байт[] в одну строку:

Files.write(dataForWriting, outputFile);

Метод Guava Files.write также принимает необязательный Options и использует те же значения по умолчанию, что и java.nio.Files.write .

Однако здесь есть подвох: метод Guava Files.write помечен аннотацией @Beta . Согласно документации , это означает, что он может измениться в любое время и поэтому не рекомендуется для использования в библиотеках.

Итак, если мы пишем библиотечный проект, мы должны рассмотреть возможность использования ByteSink .

4.2. Байт-ссылка

Мы также можем создать байт-ссылку для записи нашего байта[] :

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

ByteSink – это место назначения, в которое мы можем записывать байты. Он поставляет OutputStream к месту назначения.

Если нам нужно использовать java.nio.files.Path или предоставить специальную опцию Open , мы можем получить нашу ByteSink с помощью класса More Files :

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

5. Apache Commons IO

Apache Commons IO предоставляет некоторые общие файловые задачи.

Давайте импортируем последнюю версию commons-io :


    commons-io
    commons-io
    2.8.0

Теперь давайте напишем наш byte[] с помощью класса FileUtils :

FileUtils.writeByteArrayToFile(outputFile, dataForWriting);

Файл FileUtils.Метод writeByteArrayToFile похож на другие методы, которые мы использовали, в том, что мы даем ему файл , представляющий наше желаемое место назначения и двоичные данные, которые мы пишем. Если наш файл назначения или любой из родительских каталогов не существует, они будут созданы.

6. Заключение

В этом коротком уроке мы узнали, как записать двоичные данные из byte[] в файл, используя обычную Java и две популярные утилиты Java: Google Guava и Apache Commons IO.

Как всегда, пример кода доступен на GitHub .