Как правильно записывать байты в файл java
Перейти к содержимому

Как правильно записывать байты в файл java

  • автор:

Запись 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. Все права защищены.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *