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();
    }
}

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


person david    schedule 13.07.2012    source источник
comment
Это mergeFile вызывается из потока?   -  person kv-prajapati    schedule 13.07.2012
comment
Если вы попытаетесь объединить файлы документов MS Word: я не думаю, что это сработает, поскольку формат этого не позволяет.   -  person eckes    schedule 09.10.2014


Ответы (2)



Вы не читаете файл целиком, вы читаете из каждого файла только до 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;
            }
        }
    }
}

Вам также не нужно сбрасывать(), если вы закроете. Я использую здесь «попробовать с ресурсом», поэтому мне не нужно закрывать его явно. Лучше всего распространять исключения.

person Community    schedule 08.10.2014