Файлы копирования Java искажают файл

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

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, скопированное изображение получается искаженным. Кто-нибудь знает, что здесь может происходить? Является ли это ошибкой функции копирования здесь или я должен искать в другом месте?

Спасибо.


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


Ответы (2)


Не используйте 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) {
}
person aioobe    schedule 08.06.2011
comment
В этом отношении также не используйте Writer для двоичных данных. - person Darien; 08.06.2011
comment
Не для меня, у меня все та же проблема с искажением файлов после копирования. Мои файлы становятся почти вдвое больше по размеру байта! - person John Deverall; 12.10.2017
comment
Это было бы потрясающе — строка 153 github.com/johndeverall/BehaviourCoder/blob/for_aioobe/src/main/ - person John Deverall; 12.10.2017
comment
Да, у меня та же проблема с общим вводом-выводом, разница в размере такая же. Странно, но я напишу здесь, если что-то найду. Кодировка отличается, когда я проверяю двоичный файл, не знаю почему. Спасибо! - person John Deverall; 12.10.2017
comment
Кодировка отличается, когда я проверяю двоичный файл. Что это значит? - person aioobe; 12.10.2017
comment
Давайте продолжим обсуждение в чате. - person aioobe; 12.10.2017
comment
Я думаю, что это фильтрация ресурсов в плагине сборки maven при сборке jar. Таким образом, ваше решение выше правильно копирует файлы, которые уже повреждены. Так что с приведенным выше кодом проблем нет :) - person John Deverall; 13.10.2017

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

person Cosmin Cosmin    schedule 08.06.2011