Inputstream и Outputstream с чтением списка файлов - PullRequest
0 голосов
/ 26 апреля 2011

У меня есть файлы ArrayList

for(File file : files){

    InputStream in = FileInputStream(file);
    // process each file and save it to file
    OutputStream out = FileOutputStream(file);
    try{

    } finally {
       in.close();
       out.close();
    }
}

производительность действительно низкая, так как в каждом цикле есть вход / выход close (), есть ли лучший способ сделать это?Я попытался поместить вывод потока в цикл, он не работает.

Ответы [ 3 ]

1 голос
/ 26 апреля 2011

Использование буферизованных потоков создает огромную разницу.

Попробуйте:

for(final File file : files) {

    final InputStream in = new BufferedInputStream(new FileInputStream(file));
    final OutputStream out = new BufferedOutputStream(new FileOutputStream(new File(...)));
    try {
        // Process each file and save it to file
    }
    finally {
        try {
            in.close();
        }
        catch (IOException ignored) {}
        try {
            out.close();
        }
        catch (IOException ignored) {}
    }
}

Обратите внимание, что IOException s может быть выброшено при закрытии потоковнеобходимо игнорировать, иначе вы потеряете потенциальное начальное исключение.

Другая проблема заключается в том, что оба потока находятся в одном файле, что не работает.Итак, я полагаю, вы используете два разных файла.

1 голос
/ 26 апреля 2011

Закрытие () может занять до 20 мс. Я сомневаюсь, что это ваша программа, если у вас нет файлов тысяч.

Я подозреваю, что ваша проблема с производительностью - отсутствие буферизации ввода и вывода. Можете ли вы также показать свои буферные оболочки?

0 голосов
/ 26 апреля 2011

вы, конечно, можете построить очередь OutputStreams и передать ее в фоновый поток, который обрабатывает закрытие этих outputtreams. То же самое для InputStreams. В качестве альтернативы вы можете оставить это на усмотрение JVM - просто не закрывайте файлы и предоставьте это GC, чтобы сделать это, когда объекты будут завершены.

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