Как написать массив байтов в файл в Java?
Как я могу написать массив байтов в файл на Java?
Ответ 1
Вы можете использовать IOUtils.write(данные байта [], выход OutputStream) из Apache Commons IO.
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey key = kgen.generateKey();
byte[] encoded = key.getEncoded();
FileOutputStream output = new FileOutputStream(new File("target-file"));
IOUtils.write(encoded, output);
Ответ 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);
}
}