BufferOutputStream записывает нулевой байт при объединении файла

Я пытаюсь объединить n кусочков файла в один файл. Но у меня странное поведение на моей функции. Функция вызывается x раз за n секунд. Допустим, у меня есть 100 файлов, которые я буду объединять, каждую секунду я вызываю 5 файлов и объединяю их. и в следующую секунду сумма удваивается до 10, но от 1 до 5 - это тот же файл, что и до того, как остальное - новый файл. Он работает нормально, но в какой-то момент он дает нулевой байт или иногда дает правильный размер.

Не могли бы вы помочь мне обнаружить ошибку в моей функции ниже?

public void mergeFile(list<String> fileList, int x) {
    int count = 0;
    BufferedOutputStream out = null;
    try {
        out = new BufferedOutputStream(new FileOutputStream("Test.doc"));
        for (String file : fileList) {
            InputStream in = new BufferedInputStream(new FileInputStream(file));
            byte[] buff = new byte[1024];
            in.read(buff);
            out.write(buff);
            in.close();
            count++;
            if (count == x) {
                break;
            }
        }
        out.flush();
        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

*Извините за мой английский

2 ответа

Решение

in.read(положительный эффект);

Проверьте Javadoc. Этот метод не гарантирует заполнение буфера. Он возвращает значение, которое сообщает вам, сколько байтов он прочитал. Вы должны использовать это, и в этой ситуации вы должны использовать это при решении, сколько байтов, если таковые имеются, для записи.

Вы не читаете полный файл, вы читаете из каждого файла только до 1024 байтов. Вы должны зацикливать чтение, пока оно возвращает данные (или использовать что-то вроде Files.copy ().

Кстати: вам не нужен BufferedOutputStream, если вы копируете с большими буферами.

public void mergeFile(list<String> fileList, int x) throws IOException {
    try (OutputStream out = new FileOutputStream("Test.doc");) {
        int count=0;
        for (String file : fileList) {
            Files.copy(new File(file).toPath(), out);
            count++;
            if (count == x) {
                break;
            }
        }
    }
}

Вам также не нужно очищать (), если вы закрываете. Я использую здесь "try-with-resource", поэтому мне не нужно закрывать его явно. Лучше всего распространять исключения.

Другие вопросы по тегам