Как я могу написать массив байтов в файл на Java?

Как написать массив байтов в файл в Java?

Ответ 2

Как Себастьян Редл указывает на самый прямой вперед java.nio.file.Files.WRITE. Подробности для этого можно найти в "Чтение, письмо и создание файлов" .


Старый ответ: FileOutputStream.write(byte []) будет самым прямым. Какие данные вы хотите написать?

учебные пособия для системы Java IO могут быть вам полезны.

Ответ 3

Начиная с Java 1.7, существует новый способ: java.nio.file.Files.write

import java.nio.file.Files;
import java.nio.file.Paths;

KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey key = kgen.generateKey();
byte[] encoded = key.getEncoded();
Files.write(Paths.get("target-file"), encoded);

Java 1.7 также устраняет смущение, которое описывает Кевин: теперь чтение файла:

byte[] data = Files.readAllBytes(Paths.get("source-file"));

Ответ 4

Прокомментировал вопрос: зачем использовать для этого стороннюю библиотеку? Ответ заключается в том, что это слишком большая боль, чтобы сделать это самостоятельно. Вот пример того, как правильно выполнить обратную операцию чтения массива байтов из файла (извините, это просто код, который я легко мог получить, и это не так, как хотелось бы, чтобы ассер действительно вставлял и использовал этот код в любом случае):

public static byte[] toByteArray(File file) throws IOException { 
   ByteArrayOutputStream out = new ByteArrayOutputStream(); 
   boolean threw = true; 
   InputStream in = new FileInputStream(file); 
   try { 
     byte[] buf = new byte[BUF_SIZE]; 
     long total = 0; 
     while (true) { 
       int r = in.read(buf); 
       if (r == -1) {
         break; 
       }
       out.write(buf, 0, r); 
     } 
     threw = false; 
   } finally { 
     try { 
       in.close(); 
     } catch (IOException e) { 
       if (threw) { 
         log.warn("IOException thrown while closing", e); 
       } else {
         throw e;
       } 
     } 
   } 
   return out.toByteArray(); 
 }

Каждый человек должен быть полностью потрясен тем, что такое боль.

Использовать хорошие библиотеки. Я, неудивительно, рекомендую Guava Files.write(byte [], File).

Ответ 5

Чтобы записать массив байтов в файл, используйте метод

public void write(byte[] b) throws IOException

из класса BufferedOutputStream.

java.io.BufferedOutputStream реализует буферный выходной поток. Путем настройки такого выходного потока приложение может записывать байты в базовый выходной поток без необходимости вызвать вызов базовой системы для каждого написанного байта.

Для вашего примера вам нужно что-то вроде:

String filename= "C:/SO/SOBufferedOutputStreamAnswer";
BufferedOutputStream bos = null;
try {
//create an object of FileOutputStream
FileOutputStream fos = new FileOutputStream(new File(filename));

//create an object of BufferedOutputStream
bos = new BufferedOutputStream(fos);

KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
kgen.init(128); 
SecretKey key = kgen.generateKey(); 
byte[] encoded = key.getEncoded();

bos.write(encoded);

} 
// catch and handle exceptions...

Ответ 6

Apache Commons IO Utils имеет FileUtils.writeByteArrayToFile(). Обратите внимание, что если вы выполняете какую-либо работу с файлом/записью, то библиотека IO Apache Commons будет выполнять большую работу за вас.

Ответ 7

Не нужно использовать внешние библиотеки для раздувания вещей, особенно при работе с Android. Вот собственное решение, которое делает трюк. Это код кода из приложения, в котором хранится массив байтов как файл изображения.

    // Byte array with image data.
    final byte[] imageData = params[0];

    // Write bytes to tmp file.
    final File tmpImageFile = new File(ApplicationContext.getInstance().getCacheDir(), "scan.jpg");
    FileOutputStream tmpOutputStream = null;
    try {
        tmpOutputStream = new FileOutputStream(tmpImageFile);
        tmpOutputStream.write(imageData);
        Log.d(TAG, "File successfully written to tmp file");
    }
    catch (FileNotFoundException e) {
        Log.e(TAG, "FileNotFoundException: " + e);
        return null;
    }
    catch (IOException e) {
        Log.e(TAG, "IOException: " + e);
        return null;
    }
    finally {
        if(tmpOutputStream != null)
            try {
                tmpOutputStream.close();
            } catch (IOException e) {
                Log.e(TAG, "IOException: " + e);
            }
    }