FileOutputStream действительно медленно - PullRequest
0 голосов
/ 11 февраля 2012

Я загружаю из сети базы данных размером от 100 до 500 Кбайт.Вот мой код (удален бесполезный код):

URLConnection uConnection = downloadUrl.openConnection();
InputStream iS = uConnection.getInputStream();
BufferedInputStream bIS = new BufferedInputStream(iS);
byte[] buffer = new byte[1024];
FileOutputStream fOS = new FileOutputStream(db);
int bufferLength = 0;
while ((bufferLength = bIS.read(buffer)) > 0) {
fOS.write(buffer, 0, bufferLength);
}
fOS.close();

Моя проблема в том, что ему требуется много времени, чтобы закончить оператор while.Я где-то испортил код?Это не должно занять много времени для таких маленьких файлов, не так ли?Я говорю о 1 минуте, для трех файлов не более 1 МБ в целом ... Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 11 февраля 2012

«Медленно» действительно довольно неоднозначно.При этом, учитывая то, что вы пытаетесь сделать, вы не должны использовать BufferedInputStream, а ваш buffer слишком мал.

Буферизованные оболочки предназначены для оптимизации небольших операций чтения / записи.Поскольку все, что вы делаете, - это пытаетесь прочитать тонну данных так быстро, как только можете, вы должны просто читать непосредственно из InputStream и использовать большой буфер (скажем, 64 КБ, поскольку основной нативный код, вероятно, будет собираться в чанк).в любом случае)

byte[] buffer = new byte[65536];
...
while ((bufferLength = iS.read(buffer, 0, buffer.length) > 0) {
    ...
0 голосов
/ 16 февраля 2012

Я нашел реальное решение в Jdk 1.7 , которое сделано надежным, быстрым, простым и почти всегда вызовет жалкую завесу на старых решениях java.io. Несмотря на то, что в Интернете еще многополный примеров копирования файлов в Java с использованием In / Out Streams, я с радостью предложу всем использовать простой метод : java.nio.Files.copy (Происхождение пути, Назначение пути) с дополнительными параметрами для замены места назначения, переноса атрибутов файла метаданных и даже попытки транзакционного перемещения файлов (если это разрешено базовой ОС).Это действительно хорошая работа, которую так долго ждали!Вы можете легко преобразовать код из copy (Файл file1, File file2) , добавив « .toPath () » к экземпляру File (например, file1.toPath (),file2.toPath () . Обратите также внимание, что логический метод isSameFile (file1.toPath (), file2.toPath ()) уже используется внутри вышеуказанного метода копирования, но его легко использовать в любом случаевы хотите. Для каждого случая вы не можете обновить до 1.7, используя сообщества библиотек из Apache (commons-io) или Google (guava commons).

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