Как я могу преобразовать значение Java.Ио.Файл на байт[]
?
От комплект JDK 7 Вы можете использовать файлы.readAllBytes(Путь)
.
Пример:
import java.io.File;
import java.nio.file.Files;
File file;
// ...(file is initialised)...
byte[] fileContent = Files.readAllBytes(file.toPath());
Это зависит от того, что лучшим средством для вас. Производительность мудрый, Дон'т изобретать колесо и использовать Apache общин. Что здесь IOUtils .toByteArray(входного потока)
.
Начиная с версии JDK 7 - один лайнер:
byte[] array = Files.readAllBytes(Paths.get("/path/to/file"));
Никакие внешние зависимости.
import java.io.RandomAccessFile;
RandomAccessFile f = new RandomAccessFile(fileName, "r");
byte[] b = new byte[(int)f.length()];
f.readFully(b);
Документация для Java 8: http://docs.oracle.com/javase/8/docs/api/java/io/RandomAccessFile.html
В общем, вы должны прочитать его в память. Открыть файл, выделить массив, и читать содержимое файла в массив.
Самый простой способ что-то похожее на это:
public byte[] read(File file) throws IOException, FileTooBigException {
if (file.length() > MAX_FILE_SIZE) {
throw new FileTooBigException(file);
}
ByteArrayOutputStream ous = null;
InputStream ios = null;
try {
byte[] buffer = new byte[4096];
ous = new ByteArrayOutputStream();
ios = new FileInputStream(file);
int read = 0;
while ((read = ios.read(buffer)) != -1) {
ous.write(buffer, 0, read);
}
}finally {
try {
if (ous != null)
ous.close();
} catch (IOException e) {
}
try {
if (ios != null)
ios.close();
} catch (IOException e) {
}
}
return ous.toByteArray();
}
Это имеет какое-то ненужное копирование содержимого файла (на самом деле данные копируются в три раза: из файла буфер
, от буфер
до bytearrayoutputstream не
, с `bytearrayoutputstream не на фактический результирующий массив).
Вы также должны убедиться, что Вы читаете в памяти только файлы до определенного размера (обычно это зависит от приложения) :-).
Вы также должны относиться к исключение IOException
вне функции.
Другой способ-это:
public byte[] read(File file) throws IOException, FileTooBigException {
if (file.length() > MAX_FILE_SIZE) {
throw new FileTooBigException(file);
}
byte[] buffer = new byte[(int) file.length()];
InputStream ios = null;
try {
ios = new FileInputStream(file);
if (ios.read(buffer) == -1) {
throw new IOException(
"EOF reached while trying to read the whole file");
}
} finally {
try {
if (ios != null)
ios.close();
} catch (IOException e) {
}
}
return buffer;
}
Это не имеет никакого ненужного копирования.
FileTooBigException
- это пользовательское исключение в приложении.
В аргумент max_file_size
константы-это параметры приложения.
Для больших файлов, вы, вероятно, следует подумать потока алгоритм обработки или использования памяти отображение (см. Ява.НИО
).
Как сказал кто-то, Апач Викискладе файл утилиты может быть то, что вы ищете
public static byte[] readFileToByteArray(File file) throws IOException
Пример использования (Program.java
):
import org.apache.commons.io.FileUtils;
public class Program {
public static void main(String[] args) throws IOException {
File file = new File(args[0]); // assume args[0] is the path to file
byte[] data = FileUtils.readFileToByteArray(file);
...
}
}
Вы также можете использовать этот API NIO, чтобы сделать это. Я мог бы сделать это с настоящим Кодексом при условии, что общий размер файла (в байтах) поместится в int.
File f = new File("c:\\wscp.script");
FileInputStream fin = null;
FileChannel ch = null;
try {
fin = new FileInputStream(f);
ch = fin.getChannel();
int size = (int) ch.size();
MappedByteBuffer buf = ch.map(MapMode.READ_ONLY, 0, size);
byte[] bytes = new byte[size];
buf.get(bytes);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (fin != null) {
fin.close();
}
if (ch != null) {
ch.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
Я думаю, что его очень быстро с его помощью MappedByteBuffer.
Если вы Don'т иметь Java 8, и согласитесь со мной, что в том числе и массовые библиотеки, чтобы не писать несколько строк кода-это плохая идея:
public static byte[] readBytes(InputStream inputStream) throws IOException {
byte[] b = new byte[1024];
ByteArrayOutputStream os = new ByteArrayOutputStream();
int c;
while ((c = inputStream.read(b)) != -1) {
os.write(b, 0, c);
}
return os.toByteArray();
}
Вызывающая сторона ответственна за закрытия потока.
// Returns the contents of the file in a byte array.
public static byte[] getBytesFromFile(File file) throws IOException {
// Get the size of the file
long length = file.length();
// You cannot create an array using a long type.
// It needs to be an int type.
// Before converting to an int type, check
// to ensure that file is not larger than Integer.MAX_VALUE.
if (length > Integer.MAX_VALUE) {
// File is too large
throw new IOException("File is too large!");
}
// Create the byte array to hold the data
byte[] bytes = new byte[(int)length];
// Read in the bytes
int offset = 0;
int numRead = 0;
InputStream is = new FileInputStream(file);
try {
while (offset < bytes.length
&& (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
offset += numRead;
}
} finally {
is.close();
}
// Ensure all the bytes have been read in
if (offset < bytes.length) {
throw new IOException("Could not completely read file "+file.getName());
}
return bytes;
}
Простой способ сделать это:
File fff = new File("/path/to/file");
FileInputStream fileInputStream = new FileInputStream(fff);
// int byteLength = fff.length();
// In android the result of file.length() is long
long byteLength = fff.length(); // byte count of the file-content
byte[] filecontent = new byte[(int) byteLength];
fileInputStream.read(filecontent, 0, (int) byteLength);
Простой способ для чтения байт из файла
import java.io.*;
class ReadBytesFromFile {
public static void main(String args[]) throws Exception {
// getBytes from anyWhere
// I'm getting byte array from File
File file = null;
FileInputStream fileStream = new FileInputStream(file = new File("ByteArrayInputStreamClass.java"));
// Instantiate array
byte[] arr = new byte[(int) file.length()];
// read All bytes of File stream
fileStream.read(arr, 0, arr.length);
for (int X : arr) {
System.out.print((char) X);
}
}
}
Гуава имеет файлов.toByteArray(), чтобы предложить вам. Он имеет ряд преимуществ:
Используя такой же подход, как сообщество Вики ответа, но чище и компиляции из коробки (предпочтительный подход, если вы Don'т хотите импортировать Апач Викискладе библиотеки, например, на Android):
public static byte[] getFileBytes(File file) throws IOException {
ByteArrayOutputStream ous = null;
InputStream ios = null;
try {
byte[] buffer = new byte[4096];
ous = new ByteArrayOutputStream();
ios = new FileInputStream(file);
int read = 0;
while ((read = ios.read(buffer)) != -1)
ous.write(buffer, 0, read);
} finally {
try {
if (ous != null)
ous.close();
} catch (IOException e) {
// swallow, since not that important
}
try {
if (ios != null)
ios.close();
} catch (IOException e) {
// swallow, since not that important
}
}
return ous.toByteArray();
}
Я верю, что это самый простой способ:
org.apache.commons.io.FileUtils.readFileToByteArray(file);
ReadFully читает б.длина байт из этого файла в байтовый массив, начиная с текущего указателя файла. Этот метод многократно считывает из файла, пока запрошенное количество байт для чтения. Этот метод блоки до тех пор, пока запрошенное количество байт для чтения, конец потока обнаруживается, или исключение выдается.
RandomAccessFile f = new RandomAccessFile(fileName, "r");
byte[] b = new byte[(int)f.length()];
f.readFully(b);
Если вы хотите прочитать байт в предварительно выделенный буфер байта, этот ответ может помочь.
Первое предположение, вероятно, будет использовать [класса InputStream чтение(байт[])
](http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#read%28byte [] 29%). Однако этот способ имеет недостаток, который делает его непомерно трудно использовать: нет никакой гарантии, что массив будет заполнен полностью, даже если нет ВФ встречаются.
Вместо этого, взгляните на DataInputStream readFully(byte[])
. Это обертка для входных потоков, и не имеет вышеупомянутых вопроса. Кроме того, этот метод бросает, когда ВФ встречаются. Гораздо приятнее.
public static byte[] readBytes(InputStream inputStream) throws IOException {
byte[] buffer = new byte[32 * 1024];
int bufferSize = 0;
for (;;) {
int read = inputStream.read(buffer, bufferSize, buffer.length - bufferSize);
if (read == -1) {
return Arrays.copyOf(buffer, bufferSize);
}
bufferSize += read;
if (bufferSize == buffer.length) {
buffer = Arrays.copyOf(buffer, bufferSize * 2);
}
}
}
Позвольте мне добавить еще одно решение без использования сторонних библиотек. Он повторно использует исключение обработки шаблона, который был предложен Скотт (Ссылка). И я перенес уродливая часть в отдельном сообщении (я бы забиться в какой-нибудь класс пакета fileutils ;) )
в <предварительно><код>общественного недействительными метода someMethod() { (новый файл (фильм" окончательной байт[] буфера = читать;тест.тхт", у)); }
частная байт[] чтения(итоговый файл) { если (файл.isDirectory()) бросить новый к RuntimeException("и операция не поддерживается, файл " файл+.getAbsolutePath() + " это каталог" - а); если (файл.Длина (м) > целое число.Массив) бросить новый к RuntimeException("и операция не поддерживается, файл " файл+.getAbsolutePath() + " это слишком большой" - а);
Подобное ожидание = нуль; FileInputStream в = нуль; последний байт буфера[] = новый байт файл[(инт).Длина (м)]; попробовать { в = новый FileInputStream(файл); в.читать(буфера); } поймать (исключение e) { в ожидании = новый к RuntimeException("не исключение произошло на чтение файл " файл+.getAbsolutePath(), е); } наконец, { если (в != значение null) { попробовать { в.закрыть(); } поймать (исключение e) { если (ожидание == значение null) { в ожидании = новый к RuntimeException( на "произошло исключение при закрытии файл" файл+.getAbsolutePath(), е); } } } если (в ожидании != значение null) { бросить новый к RuntimeException(в ожидании); } } возврат буфер; }</код></пре>
Не только следующим образом преобразовать в Java.Ио.Файл в массив Byte[], я также обнаружил, что это самый быстрый способ, чтобы прочитать в файл, при тестировании различных файл Java методы чтения против друг друга:
Ява.НИО.файл.Файлов.readAllBytes()
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
public class ReadFile_Files_ReadAllBytes {
public static void main(String [] pArgs) throws IOException {
String fileName = "c:\\temp\\sample-10KB.txt";
File file = new File(fileName);
byte [] fileBytes = Files.readAllBytes(file.toPath());
char singleChar;
for(byte b : fileBytes) {
singleChar = (char) b;
System.out.print(singleChar);
}
}
}