Java: обработка больших файлов во входных потоках - PullRequest
2 голосов
/ 17 января 2012

У меня есть приложение Java, которое извлекает относительно небольшой файл .zip с использованием URL, сохраняет его во временном каталоге, распаковывает на локальный компьютер и вносит некоторые изменения в один из файлов. Все это прекрасно работает.

Однако я получаю доступ к файлу .zip через BufferedInputStream следующим образом:

Url url = "http://somedomain.com/file.zip";
InputStream is = new BufferedInputStream(url.openStream(), 1024);

Меня беспокоит, что это приложение на самом деле будет использоваться для передачи очень больших zip файлов, и мне было интересно, является ли BufferedInputStream на самом деле лучшим способом сделать это, или я бы просто в конечном итоге бросает какой-то тип OutOfMemoryException?

Итак, мой вопрос, подойдет ли BufferedInputStream для этой работы, или я должен поступить по-другому?

Ответы [ 3 ]

6 голосов
/ 17 января 2012

BufferedInputStream не загружает весь файл в память, он использует только внутренний буфер, в вашем случае размер 1024 байта = 1 КБ.Это никогда не становится больше, чем это.Вы могли бы на самом деле увеличить значение, если у вас не будет много потоков одновременно.

Редактировать: возможно, вы думаете о ByteArrayOutputStream , где данные сохраняются в памяти.

1 голос
/ 17 января 2012

Из официальных Java Tutorials - Buffered Streams :

Платформа Java реализует буферизованные потоки ввода / вывода. Буферизованный ввод потоки считывают данные из области памяти, известной как буфер; родной API ввода вызывается только тогда, когда буфер пуст. Аналогично, буферизируется выходные потоки записывают данные в буфер, а собственный API вывода вызывается только когда буфер заполнен.

Есть еще одна замечательная статья о СОЛНЦЕ .

Итак, ответ таков: BufferedInputStream подходит для такой работы с точки зрения производительности.

И да, потребление памяти не так сильно зависит от типа входного потока ....

1 голос
/ 17 января 2012

Это зависит от того, что вы делаете с контентом, который вы читаете. Если вы прочитаете все в памяти, это не удастся. Если вы напишите это в другой поток, то все будет хорошо. Используйте BufferedInputStream

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...