Java загружает бинарные файлы

Пожалуйста, покажите мне лучшие/быстрые методы для:

1) Загрузка очень маленьких бинарных файлов в память. Например иконки;

2) Загрузка/чтение очень больших бинарных файлов размером 512Mb+. Может быть, я должен использовать ввод-вывод с отображением памяти?

3) Ваш обычный выбор, когда вы не хотите думать о размере/скорости, а должны сделать только одно: прочитать все байты в память?

Спасибо!!!

P.S. Извините за, может быть, тривиальный вопрос. Пожалуйста, не закрывайте его ;)

P.S.2. Зеркало аналогового вопроса для C#;


person Edward83    schedule 22.11.2010    source источник


Ответы (2)


Для файлов с отображением памяти в java есть пакет nio: Файлы с отображением памяти

Ознакомьтесь с классом потока байтов для небольших файлов: Byte Stream

Проверьте буферизованный ввод-вывод для больших файлов: буферизованный поток

person user489041    schedule 22.11.2010

Самый простой способ прочитать небольшой файл в память:

// Make a file object from the path name
File file=new File("mypath");
// Find the size
int size=file.length();
// Create a buffer big enough to hold the file
byte[] contents=new byte[size];
// Create an input stream from the file object
FileInputStream in=new FileInutStream(file);
// Read it all
in.read(contents);
// Close the file
in.close();

В реальной жизни вам понадобятся блоки try/catch на случай ошибок ввода-вывода.

Если вы читаете большой файл, я настоятельно рекомендую НЕ считывать его все в память за один раз, если этого можно избежать. Прочитайте его и обработайте его кусками. Это очень редкое приложение, которому действительно необходимо одновременно хранить в памяти файл размером 500 МБ.

В Java нет такой вещи, как ввод-вывод с отображением памяти. Если это то, что вам нужно сделать, вам просто нужно создать действительно большой массив байтов.

person Jay    schedule 22.11.2010
comment
read не гарантирует чтение всего сразу. Я бы предложил использовать DataInputyStream.readFully(); - person Peter Lawrey; 22.11.2010
comment
JDK 1.4 и более поздние версии предоставляют nio, и я думаю, что MappedByteBuffer должен работать как ввод-вывод с отображением памяти. - person secmask; 22.11.2010
comment
Хорошо, я не был знаком с этим классом. На самом деле это не ввод-вывод с отображением памяти, по крайней мере, не в том смысле, в каком я понимал этот термин в те дни, когда я еще не работал с Windows, когда порты ввода-вывода были сопоставлены с волшебными ячейками памяти. Это больше похоже на смоделированный ввод-вывод с отображением массива. Но что угодно. Если это работает для вас, круто. - person Jay; 23.11.2010