#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