Автор оригинала: 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 .