Java копирует файлы, искажающие файл

#java #file-io #file-copying

#java #file-io #копирование файлов

Вопрос:

Итак, я пытаюсь скопировать файл в новое местоположение таким образом:

 FileReader in = new FileReader(strTempPath);
FileWriter out = new FileWriter(destTempPath);

int c;
while ((c = in.read()) != -1){
    out.write(c);
}

in.close();
out.close();
  

Который отлично работает в 99% случаев. Иногда, если изображение довольно маленькое, <= 60x80px, скопированное изображение получается полностью искаженным. Кто-нибудь знает, что здесь может происходить? Это ошибка функции копирования здесь или я должен искать в другом месте?

Спасибо.

Комментарии:

1. это сильно зависит от кодировки символов вашей платформы. В большинстве кодировок копирование двоичных данных приведет к уничтожению от нескольких байтовых значений до множества байтовых комбинаций. Если программа внезапно «заработает», если вы запустите ее с -Dfile.encoding=ISO-8859-1, вы можете быть уверены, что в каком-то месте вы пытались использовать readers / writers для копирования двоичных данных. ISO-8859-1 — одна из немногих кодировок, которые не уничтожают двоичные данные, но в зависимости от вашего языка текст при отображении будет казаться тарабарщиной.

Ответ №1:

Не используйте Readers / Writers для чтения двоичных данных. Используйте InputStreams / OutputStreams или Channels из пакета nio (см. Ниже).

Пример из exampledepot.com:

 try {
    // Create channel on the source
    FileChannel srcChannel = new FileInputStream("srcFilename").getChannel();

    // Create channel on the destination
    FileChannel dstChannel = new FileOutputStream("dstFilename").getChannel();

    // Copy file contents from source to destination
    dstChannel.transferFrom(srcChannel, 0, srcChannel.size());

    // Close the channels
    srcChannel.close();
    dstChannel.close();
} catch (IOException e) {
}
  

Комментарии:

1. Если уж на то пошло, также не используйте Writer для двоичных данных.

2. Не для меня, у меня все еще та же проблема с искажением моих файлов после копирования. Размер моих файлов становится почти в два раза больше байтового!

3. Это было бы потрясающе — Строка 153 github.com/johndeverall/BehaviourCoder/blob/for_aioobe/src/main /…

4. Да, у меня такая же проблема с commons io, такая же разница в размере. Это странно, но я опубликую здесь, если что-то найду. Кодировка отличается, когда я проверяю двоичный файл, не уверен, почему. Спасибо!

5. «Кодировка отличается, когда я проверяю двоичный файл». Что это значит?

Ответ №2:

Удобный класс для чтения символьных файлов. http://download.oracle.com/javase/6/docs/api/java/io/FileReader.html