Как правильно записывать байты в файл 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 предназначены прежде всего для записи двоичных файлов, то есть для записи и чтения байтов. И хотя они также могут использоваться для работы с текстовыми файлами, но все же для этой задачи больше подходят другие классы.
Как перевести файл в массив байтов
Как перевести файл в массив байтов и наоборот? Файлом может быть MS Word и Excel или что-то другое. Также и строку.
Отслеживать
user177221
задан 7 сен 2015 в 3:48
Aslan Kussein Aslan Kussein
1,776 2 2 золотых знака 14 14 серебряных знаков 35 35 бронзовых знаков3 ответа 3
Сортировка: Сброс на вариант по умолчанию
byte[] array = Files.readAllBytes(Paths.get(fileName));Отслеживать
5,509 16 16 серебряных знаков 42 42 бронзовых знака
ответ дан 7 сен 2015 в 7:33
465 3 3 серебряных знака 13 13 бронзовых знаковbyte[] fileInArray = new byte[(int)file.length()]; FileInputStream f = new FileInputStream(""); f.read(fileInArray);Это без использования всякого рода сторонних библиотек. Средствами java.
Отслеживать
ответ дан 7 сен 2015 в 4:18
Виталий Вихляев Виталий Вихляев
891 15 15 серебряных знаков 34 34 бронзовых знака\я вот если я пытаюсь из джава класса сделать массив байтов и какой метод мне использовать не знаете?
7 сен 2015 в 4:28
@Aslan Kussein с файлами .java точно так же. Если же вам нужно в массив байтов преобразовать объект какого-то класса , то вам необходимо его сериализовать. Очень хороший ресурс на эту тему здесь
7 сен 2015 в 4:56
А вы документацию к InputStream.read читали? Там вообще-то написано «Reads some number of bytes from the input stream and stores them into the buffer array b». А вы даже возвращаемое значение не проверяете. Чтение может прерваться в произвольный момент, и вы никак не узнаете, сколько байт считано по факту.
7 сен 2015 в 6:20
@Tagir Valeev никто не мешает обработать ошибку при чтении. Насчет контроля количества считанных байт согласен- в моем способе его нет (а может и не нужен). И все же. Как вы решали бы эту проблему, при использовании java более взрослых версий?
7 сен 2015 в 7:10
Вообще, вероятно, лучше memory-mapping сделать. Это будет быстрее. Если без мемори-мэппинга — воспользовался бы библиотекой или написал бы вручную примерно то же самое, что в readAllBytes .
Java — Как сохранить байт [] в файл
В этом примере Java показано, как прочитать файл в байтовый массив и сохранить байтовый массив обратно в новый файл с помощью классических try-catch-try-catch, JDK 7 try-resources и решения Java.NIO.
package com.mkyong; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class ArrayOfBytesToFile < private static final String UPLOAD_FOLDER = "C:\temp\"; public static void main(String[] args) < FileInputStream fileInputStream = null; try < File file = new File("C:\temp\testing1.txt"); byte[] bFile = new byte[(int) file.length()]; // читать файл в байты [] fileInputStream = new FileInputStream(file); fileInputStream.read(bFile); // сохранить байты [] в файл writeBytesToFile(bFile, UPLOAD_FOLDER + "test1.txt"); writeBytesToFileClassic(bFile, UPLOAD_FOLDER + "test2.txt"); writeBytesToFileNio(bFile, UPLOAD_FOLDER + "test3.txt"); System.out.println("Done"); >catch (IOException e) < e.printStackTrace(); >finally < if (fileInputStream != null) < try < fileInputStream.close(); >catch (IOException e) < e.printStackTrace(); >> > > // Classic, catch (IOException e) < e.printStackTrace(); >finally < if (fileOuputStream != null) < try < fileOuputStream.close(); >catch (IOException e) < e.printStackTrace(); >> > > // Начиная с JDK 7 - попробуйте ресурсы private static void writeBytesToFile(byte[] bFile, String fileDest) < try (FileOutputStream fileOuputStream = new FileOutputStream(fileDest)) < fileOuputStream.write(bFile); >catch (IOException e) < e.printStackTrace(); >> // Начиная с JDK 7, NIO private static void writeBytesToFileNio(byte[] bFile, String fileDest) < try < Path path = Paths.get(fileDest); Files.write(path, bFile); >catch (IOException e) < e.printStackTrace(); >> >Рекомендации
- Как преобразовать файл в массив байтов
- Файлы JavaDoc
- FileOutputStream JavaDoc
ЧИТАТЬ ТАКЖЕ: Java - Как преобразовать Char Array в строку
Запись байта [] в файл в Java
«Преобразовать массив байтов в объект File» не имеет никакого смысла, кроме как в том, что вы хотите записать байты в файл. У вас есть как минимум 3 разных ответа ниже, как это сделать. Это то, что вы после? В противном случае, пожалуйста, уточните.
pap 26 июль 2011, в 11:14
Я разрабатываю в Android . У меня есть файл, сохраненный на диске в зашифрованном виде и разблокировать шифрование, поэтому я получил массив байтов, поэтому я хочу преобразовать их в файл, чтобы показать файл PDF в программе просмотра PDF, но без сохранения файла на диске без шифрования
farajnew 26 июль 2011, в 11:21
Ну, тогда это совсем другое. Вы хотите запустить pdf-просмотрщик, по сути, из чего-то вроде MemoryFile ( developer.android.com/reference/android/os/MemoryFile.html ). Не уверен, как вы это сделаете, или как вы отображаете PDF. У вас есть код или информация, которую вы можете добавить о том, как вы на самом деле вызываете программу просмотра PDF? А какой просмотрщик вы используете?
pap 26 июль 2011, в 12:17
Пожалуйста, измените вопрос и название, чтобы отразить тот факт, что вы спрашиваете о чем-то связанном с PDF. Вопрос выглядит пока запутанным.
Mike Keskinov 29 авг. 2012, в 16:22
-1 Вопрос совершенно не связан с тем, что ты хочешь знать. Создайте новый вопрос и задайте вопрос «Как я могу рендерить PDF на Android из байтов в памяти?»
Aaron Digulla 10 окт. 2012, в 13:25
Показать ещё 3 комментария
Поделиться:5 ответов
Лучший ответ
Объект File не содержит содержимого файла. Это только указатель на файл на вашем жестком диске (или другой носитель, например SSD, USB-накопитель, общий сетевой ресурс). Поэтому я думаю, что вы хотите записать его на жесткий диск.
Вы должны записать файл, используя некоторые классы в Java API
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(yourFile)); bos.write(fileBytes); bos.flush(); bos.close();Вы также можете использовать Writer вместо OutputStream. Использование записи позволит вам написать текст (String, char []).
BufferedWriter bw = new BufferedWriter(new FileWriter(yourFile));Поскольку вы сказали, что хотите сохранить все в памяти и не хотите ничего писать, вы можете попробовать использовать ByteArrayInputStream . Это имитирует InputStream, который вы можете передать большинству классов.
ByteArrayInputStream bais = new ByteArrayInputStream(yourBytes);Martijn Courteaux 26 июль 2011, в 10:44
ПоделитьсяФайловый объект является нулевым? и я не хочу, чтобы что-либо было сохранено на диске . Это нормально, чтобы быть в памяти, так как конвертировать массив байтов в объект File
farajnew 26 июль 2011, в 11:10
Я получил это java.io.IOException: открытие не удалось: EACCES (Отказано в доступе) в приложении для Android при записи BufferedOutputStream bos = new BufferedOutputStream (new FileOutputStream (yourFile));
Sanket Thakkar 02 авг. 2013, в 07:41
@SanketThakkar: Возможно, у вас нет прав на запись (разрешение) на запись файла в этом месте. Попробуйте другое место.