Тихая ошибка при копировании файлов - PullRequest
4 голосов
/ 13 октября 2011

У меня есть следующий метод копирования файлов:

public static void nioCopy(File source, File destination) {
    FileInputStream fis = null;
    FileOutputStream fos = null;
    FileChannel input = null;
    FileChannel output = null;
    try {
        fis = new FileInputStream(source);
        fos = new FileOutputStream(destination);

         input = fis.getChannel();
         output = fos.getChannel();

        input.transferTo(0, input.size(), output);

    } catch (FileNotFoundException ex) {
        Logger.getLogger(Utilities.class.getName()).log(Level.SEVERE, "Can't find either of input/output files.", ex);
    } catch (IOException ex) {
        Logger.getLogger(Utilities.class.getName()).log(Level.SEVERE, "Can't open either of input/output file for reading/writing", ex);
    } finally {
        try {
            fis.close();
            fos.close();
            input.close();
            output.close();
        } catch (IOException ex) {
            Logger.getLogger(Utilities.class.getName()).log(Level.SEVERE, "Error closing streams", ex);
        }

    }
}

И я использую для копирования файла, но иногда я получаю тихую ошибку или неопределенное поведение, или я просто не знаю, как это объяснитьи вот что я получаю:

Вот мой источник:

-rw-r--r-- 1 nb9 team92 3.1G 2011-10-13 16:31 6443_6#5_1_6443_6#5_2.fastq.f.fq.gz

А вот и пункт назначения:

-rw-r--r-- 1 nb9 team92 2.0G 2011-10-13 16:49 6443_6#5_1_6443_6#5_2.fastq.f.fq.gz

Я не получаю исключений, пока этот процессвыполняется, и, судя по всему, все должно быть успешно, но затем, когда я начинаю распаковывать файл, я получаю:

java.io.EOFException: неожиданный конец входного потока ZLIB

Ясно, чтопункт назначения на 1 гиг от оригинальной отметки.

Единственная особенность заключается в том, что оба файла находятся на ОЧЕНЬ занятой файловой системе блеска. Возможно ли, что это делает некоторые забавные вещи?

1 Ответ

2 голосов
/ 13 октября 2011

То, что урезано на 2Gb, вызвало у меня подозрение. Я искал, и это похоже на проблему с nio . Также может быть так, что целевая файловая система допускает максимум 2 ГБ файлов.

Из Java NIO: Буферы

В настоящее время размеры буфера ограничены 2 ГБ (максимальное положительное число, которое может быть представлено в int. Обновление, запланированное для Java 7, позволит создавать большие буферы (с размером и индексами, хранящимися как long).

В любом случае, просто чтобы быть уверенным:

  • Можете ли вы попробовать скопировать его на ту же файловую систему, если у вас есть место?
  • Можете ли вы попробовать с Apache Commons IO FileUtils.copyFile () ? Кажется, они исправили эту проблему .
  • Если вы можете обновить, попробуйте с Java 7, так как уже вышел
...