Запись byte[] в файл на Java
В этом кратком руководстве мы изучим несколько различных способов записи массива байтов 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.guavagroupId> artifactId>guavaartifactId> version>31.0.1-jreversion> 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-iogroupId> artifactId>commons-ioartifactId> version>2.11.0version> dependency>
Теперь давайте напишем наш byte[] с помощью класса FileUtils :
FileUtils.writeByteArrayToFile(outputFile, dataForWriting);
Метод FileUtils.writeByteArrayToFile похож на другие методы, которые мы использовали, в том, что мы даем ему файл , представляющий желаемое место назначения, и двоичные данные, которые мы записываем. Если наш целевой файл или любой из родительских каталогов не существует, они будут созданы.
6. Заключение
В этом коротком руководстве мы узнали, как записывать двоичные данные из byte[] в файл, используя обычную Java и две популярные служебные библиотеки Java: Google Guava и Apache Commons IO.
Как всегда, код примера доступен на GitHub .
- 1. Обзор
- 2. Java ввод/вывод
- 3. Java НИО
- 4. Google Гуава
- 4.1. Файлы гуавы
- 4.2. БайтСинк
Запись byte[] в файл на Java
В этом кратком руководстве мы изучим несколько различных способов записи массива байтов 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.guavagroupId> artifactId>guavaartifactId> version>31.0.1-jreversion> 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-iogroupId> artifactId>commons-ioartifactId> version>2.11.0version> dependency>
Теперь давайте напишем наш byte[] с помощью класса FileUtils :
FileUtils.writeByteArrayToFile(outputFile, dataForWriting);
Метод FileUtils.writeByteArrayToFile похож на другие методы, которые мы использовали, в том, что мы даем ему файл , представляющий желаемое место назначения, и двоичные данные, которые мы записываем. Если наш целевой файл или любой из родительских каталогов не существует, они будут созданы.
6. Заключение
В этом коротком руководстве мы узнали, как записывать двоичные данные из byte[] в файл, используя обычную Java и две популярные служебные библиотеки Java: Google Guava и Apache Commons IO.
Как всегда, код примера доступен на GitHub .
- 1. Обзор
- 2. Java ввод/вывод
- 3. Java НИО
- 4. Google Гуава
- 4.1. Файлы гуавы
- 4.2. БайтСинк
Как правильно записывать байты в файл java
Класс FileOutputStream предназначен для записи байтов в файл. Он является производным от класса OutputStream, поэтому наследует всю его функциональность.
Через конструктор класса FileOutputStream задается файл, в который производится запись. Класс поддерживает несколько конструкторов:
FileOutputStream(String filePath) FileOutputStream(File fileObj) FileOutputStream(String filePath, boolean append) FileOutputStream(File fileObj, boolean append)
Файл задается либо через строковый путь, либо через объект File. Второй параметр — append задает способ записи: eсли он равен true, то данные дозаписываются в конец файла, а при false — файл полностью перезаписывается
Например, запишем в файл строку:
import java.io.*; public class Program < public static void main(String[] args) < String text = "Hello world!"; // строка для записи try(FileOutputStream fos=new FileOutputStream("notes.txt")) < // перевод строки в байты byte[] buffer = text.getBytes(); fos.write(buffer, 0, buffer.length); System.out.println("The file has been written"); >catch(IOException ex) < System.out.println(ex.getMessage()); >> >
Для создания объекта FileOutputStream используется конструктор, принимающий в качестве параметра путь к файлу для записи. Если такого файла нет, то он автоматически создается при записи. Так как здесь записываем строку, то ее надо сначала перевести в массив байтов. И с помощью метода write строка записывается в файл.
Для автоматического закрытия файла и освобождения ресурса объект FileOutputStream создается с помощью конструктции try. catch.
При этом необязательно записывать весь массив байтов. Используя перегрузку метода write() , можно записать и одиночный байт:
fos.write(buffer[0]); // запись первого байта
Чтение файлов и класс FileInputStream
Для считывания данных из файла предназначен класс FileInputStream , который является наследником класса InputStream и поэтому реализует все его методы.
Для создания объекта FileInputStream мы можем использовать ряд конструкторов. Наиболее используемая версия конструктора в качестве параметра принимает путь к считываемому файлу:
FileInputStream(String fileName) throws FileNotFoundException
Если файл не может быть открыт, например, по указанному пути такого файла не существует, то генерируется исключение FileNotFoundException .
Считаем данные из ранее записанного файла и выведем на консоль:
import java.io.*; public class Program < public static void main(String[] args) < try(FileInputStream fin=new FileInputStream("notes.txt")) < int i; while((i=fin.read())!=-1)< System.out.print((char)i); >> catch(IOException ex) < System.out.println(ex.getMessage()); >> >
В данном случае мы считываем каждый отдельный байт в переменную i:
while((i=fin.read())!=-1)
Когда в потоке больше нет данных для чтения, метод возвращает число -1.
Затем каждый считанный байт конвертируется в объект типа char и выводится на консоль.
Подобным образом можно считать данные в массив байтов и затем производить с ним манипуляции:
import java.io.*; public class Program < public static void main(String[] args) < try(FileInputStream fin=new FileInputStream("notes.txt")) < byte[] buffer = new byte[256]; System.out.println("File data:"); int count; while((count=fin.read(buffer))!=-1)< for(int i=0; i
> > catch(IOException ex) < System.out.println(ex.getMessage()); >> > В данном случае с помощью метода read() считываем данные в массив buffer длиной 256 байтов. Метод возвращает количество считанных байтов.
Поскольк файл может быть больше 256 байтов, то считываем в цикле while до конца файла. Когда больше не останется файлов для считывания, то метод возвратит -1.
while((count=fin.read(buffer))!=-1)
Поскольку количество считанных байтов/размер файла могут быть меньше 256 байт, то реальное количество считанных байт сохраняем в переменную count. Затем выводим считанное количество данных на консоль в цикле for.
for(int i=0; iСовместим оба класса и выполним чтение из одного и запись в другой файл:
import java.io.*; public class Program < public static void main(String[] args) < try(FileInputStream fin=new FileInputStream("notes.txt"); FileOutputStream fos=new FileOutputStream("notes_new.txt")) < byte[] buffer = new byte[256]; int count; // считываем буфер while((count=fin.read(buffer))!=-1)< // записываем из буфера в файл fos.write(buffer, 0, count); >System.out.println("File has been written"); > catch(IOException ex) < System.out.println(ex.getMessage()); >> >
Классы FileInputStream и FileOutputStream предназначены прежде всего для записи двоичных файлов, то есть для записи и чтения байтов. И хотя они также могут использоваться для работы с текстовыми файлами, но все же для этой задачи больше подходят другие классы.
- Глава 1. Введение в Java
- Язык программирования Java
- Установка Java
- Первая программа на Java
- Первая программа в IntelliJ IDEA
- Первая программа в NetBeans
- Первая программа в Eclipse
- Структура программы
- Переменные и константы
- Типы данных
- Консольный ввод/вывод в Java
- Арифметические операции
- Поразрядные операции
- Условные выражения
- Операции присваивания и приоритет операций
- Преобразования базовых типов данных
- Условные конструкции
- Циклы
- Массивы
- Методы
- Параметры методов
- Оператор return. Результат метода
- Перегрузка методов
- Рекурсивные функции
- Введение в обработку исключений
- Классы и объекты
- Пакеты
- Модификаторы доступа и инкапсуляция
- Статические члены и модификатор static
- Объекты как параметры методов
- Внутренние и вложенные классы
- Наследование
- Абстрактные классы
- Иерархия наследования и преобразование типов
- Интерфейсы
- Интерфейсы в механизме обратного вызова
- Перечисления enum
- Класс Object и его методы
- Обобщения (Generics)
- Ограничения обобщений
- Наследование и обобщения
- Ссылочные типы и клонирование объектов
- Records
- Оператор throws
- Классы исключений
- Создание своих классов исключений
- Типы коллекций. Интерфейс Collection
- Класс ArrayList и интерфейс List
- Очереди и класс ArrayDeque
- Класс LinkedList
- Интерфейс Set и класс HashSet
- SortedSet, NavigableSet, TreeSet
- Интерфейсы Comparable и Comporator. Сортировка
- Интерфейс Map и класс HashMap
- Интерфейсы SortedMap и NavigableMap. Класс TreeMap
- Итераторы
- Потоки ввода-вывода
- Чтение и запись файлов. FileInputStream и FileOutputStream
- Закрытие потоков
- Классы ByteArrayInputStream и ByteArrayOutputStream
- Буферизованные потоки BufferedInputStream и BufferedOutputStream
- Форматируемый вывод. PrintStream и PrintWriter
- Классы DataOutputStream и DataInputStream
- Чтение и запись текстовых файлов
- Буферизация символьных потоков. BufferedReader и BufferedWriter
- Сериализация объектов
- Класс File. Работа с файлами и каталогами
- Работа с ZIP-архивами
- Класс Console
- Введение в строки. Класс String
- Основные операции со строками
- StringBuffer и StringBuilder
- Регулярные выражения
- Введение в лямбда-выражения
- Лямбды как параметры и результаты методов
- Встроенные функциональные интерфейсы
- Класс Thread
- Создание и выполнение потоков
- Завершение и прерывание потока
- Синхронизация потоков. Оператор synchronized
- Взаимодействие потоков. Методы wait и notify
- Семафоры
- Обмен между потоками. Класс Exchanger
- Класс Phaser
- Блокировки. ReentrantLock
- Условия в блокировках
- Введение в Stream API
- Создание потока данных
- Фильтрация, перебор элементов и отображение
- Сортировка
- Получение подпотока и объединение потоков
- Методы skip и limit
- Операции сведения
- Метод reduce
- Тип Optional
- Метод collect
- Группировка
- Параллельные потоки
- Параллельные операции над массивами
- Создание модуля
- Зависимые модули
- Взаимодействие между модулями
- Математические вычисления и класс Math
- Большие числа BigInteger и BigDecimal
- Работа с датами. LocalDate
Помощь сайту
410011174743222
Перевод на карту
Номер карты:
4048415020898850Контакты для связи: metanit22@mail.ru
Copyright © metanit.com, 2024. Все права защищены.
Как правильно записывать байты в файл java
Хотя с помощью ранее рассмотренных классов можно записывать текст в файлы, однако они предназначены прежде всего для работы с бинарными потоками данных, и их возможностей для полноценной работы с текстовыми файлами недостаточно. И для этой цели служат совсем другие классы, которые являются наследниками абстрактных классов Reader и Writer .
Запись файлов. Класс FileWriter
Класс FileWriter является производным от класса Writer. Он используется для записи текстовых файлов.
Чтобы создать объект FileWriter, можно использовать один из следующих конструкторов:
FileWriter(File file) FileWriter(File file, boolean append) FileWriter(FileDescriptor fd) FileWriter(String fileName) FileWriter(String fileName, boolean append)
Так, в конструктор передается либо путь к файлу в виде строки, либо объект File, который ссылается на конкретный текстовый файл. Параметр append указывает, должны ли данные дозаписываться в конец файла (если параметр равен true), либо файл должен перезаписываться.
Запишем в файл какой-нибудь текст:
import java.io.*; public class Program < public static void main(String[] args) < try(FileWriter writer = new FileWriter("notes3.txt", false)) < // запись всей строки String text = "Hello Gold!"; writer.write(text); // запись по символам writer.append('\n'); writer.append('E'); writer.flush(); >catch(IOException ex) < System.out.println(ex.getMessage()); >> >
В конструкторе использовался параметр append со значением false - то есть файл будет перезаписываться. Затем с помощью методов, определенных в базовом классе Writer производится запись данных.
Чтение файлов. Класс FileReader
Класс FileReader наследуется от абстрактного класса Reader и предоставляет функциональность для чтения текстовых файлов.
Для создания объекта FileReader мы можем использовать один из его конструкторов:
FileReader(String fileName) FileReader(File file) FileReader(FileDescriptor fd)
А используя методы, определенные в базом классе Reader, произвести чтение файла:
import java.io.*; public class Program < public static void main(String[] args) < try(FileReader reader = new FileReader("notes3.txt")) < // читаем посимвольно int c; while((c=reader.read())!=-1)< System.out.print((char)c); >> catch(IOException ex) < System.out.println(ex.getMessage()); >> >
Также мы можем считывать в промежуточный буфер из массива символов:
import java.io.*; import java.util.Arrays; public class Program < public static void main(String[] args) < try(FileReader reader = new FileReader("notes3.txt")) < char[] buf = new char[256]; int c; while((c = reader.read(buf))>0) < if(c < 256)< buf = Arrays.copyOf(buf, c); >System.out.print(buf); > > catch(IOException ex) < System.out.println(ex.getMessage()); >> >
В данном случае считываем последовательно символы из файла в массив из 256 символов, пока не дойдем до конца файла в этом случае метод read возвратит число -1.
Поскольку считанная порция файла может быть меньше 256 символов (например, в файле всего 73 символа), и если количество считанных данных меньше размера буфера (256), то выполняем копирование массива с помощью метода Arrays.copy. То есть фактически обрезаем массив buf, оставляя в нем только те символы, которые считаны из файла.
- Глава 1. Введение в Java
- Язык программирования Java
- Установка Java
- Первая программа на Java
- Первая программа в IntelliJ IDEA
- Первая программа в NetBeans
- Первая программа в Eclipse
- Структура программы
- Переменные и константы
- Типы данных
- Консольный ввод/вывод в Java
- Арифметические операции
- Поразрядные операции
- Условные выражения
- Операции присваивания и приоритет операций
- Преобразования базовых типов данных
- Условные конструкции
- Циклы
- Массивы
- Методы
- Параметры методов
- Оператор return. Результат метода
- Перегрузка методов
- Рекурсивные функции
- Введение в обработку исключений
- Классы и объекты
- Пакеты
- Модификаторы доступа и инкапсуляция
- Статические члены и модификатор static
- Объекты как параметры методов
- Внутренние и вложенные классы
- Наследование
- Абстрактные классы
- Иерархия наследования и преобразование типов
- Интерфейсы
- Интерфейсы в механизме обратного вызова
- Перечисления enum
- Класс Object и его методы
- Обобщения (Generics)
- Ограничения обобщений
- Наследование и обобщения
- Ссылочные типы и клонирование объектов
- Records
- Оператор throws
- Классы исключений
- Создание своих классов исключений
- Типы коллекций. Интерфейс Collection
- Класс ArrayList и интерфейс List
- Очереди и класс ArrayDeque
- Класс LinkedList
- Интерфейс Set и класс HashSet
- SortedSet, NavigableSet, TreeSet
- Интерфейсы Comparable и Comporator. Сортировка
- Интерфейс Map и класс HashMap
- Интерфейсы SortedMap и NavigableMap. Класс TreeMap
- Итераторы
- Потоки ввода-вывода
- Чтение и запись файлов. FileInputStream и FileOutputStream
- Закрытие потоков
- Классы ByteArrayInputStream и ByteArrayOutputStream
- Буферизованные потоки BufferedInputStream и BufferedOutputStream
- Форматируемый вывод. PrintStream и PrintWriter
- Классы DataOutputStream и DataInputStream
- Чтение и запись текстовых файлов
- Буферизация символьных потоков. BufferedReader и BufferedWriter
- Сериализация объектов
- Класс File. Работа с файлами и каталогами
- Работа с ZIP-архивами
- Класс Console
- Введение в строки. Класс String
- Основные операции со строками
- StringBuffer и StringBuilder
- Регулярные выражения
- Введение в лямбда-выражения
- Лямбды как параметры и результаты методов
- Встроенные функциональные интерфейсы
- Класс Thread
- Создание и выполнение потоков
- Завершение и прерывание потока
- Синхронизация потоков. Оператор synchronized
- Взаимодействие потоков. Методы wait и notify
- Семафоры
- Обмен между потоками. Класс Exchanger
- Класс Phaser
- Блокировки. ReentrantLock
- Условия в блокировках
- Введение в Stream API
- Создание потока данных
- Фильтрация, перебор элементов и отображение
- Сортировка
- Получение подпотока и объединение потоков
- Методы skip и limit
- Операции сведения
- Метод reduce
- Тип Optional
- Метод collect
- Группировка
- Параллельные потоки
- Параллельные операции над массивами
- Создание модуля
- Зависимые модули
- Взаимодействие между модулями
- Математические вычисления и класс Math
- Большие числа BigInteger и BigDecimal
- Работа с датами. LocalDate
Помощь сайту
410011174743222
Перевод на карту
Номер карты:
4048415020898850Контакты для связи: metanit22@mail.ru
Copyright © metanit.com, 2024. Все права защищены.