В основном вы должны прочитать это в памяти. Откройте файл, выделите массив и прочитайте содержимое файла в массив.
Самый простой способ примерно такой:
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();
}
Это приводит к ненужному копированию содержимого файла (фактически данные копируются три раза: из файла в buffer
, из buffer
в 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
- это параметры приложения.
Для больших файлов вы, вероятно, должны подумать об алгоритме обработки потока или использовать отображение памяти (см. java.nio
).