Загрузка файлов с FTP на локальный компьютер с использованием Java делает файл нечитаемым - проблемы с кодировкой
Я разработал код, который читает очень большие файлы с FTP и записывает их на локальный компьютер с помощью Java. Код, который делает это следующим образом. Это часть из next(Text key, Text value)
внутри RecordReader
из CustomInputFormat
if(!processed)
{
System.out.println("in processed");
in = fs.open(file);
processed=true;
}
while(bytesRead <= fileSize) {
byte buf[] = new byte[1024];
try {
in.read(buf);
in.skip(1024);
bytesRead+=1024;
long diff = fileSize-bytesRead;
if(diff<1024)
{
break;
}
value.set(buf, 0, 1024); // This is where the value of the record is set and it goes to the mapper .
}
catch(Exception e)
{
e.printStackTrace();
}
}
if(diff<1024)
{
int difference= (int) (fileSize-bytesRead);
byte buf[] = new byte[difference];
in.read(buf);
bytesRead+=difference;
}
System.out.println("closing stream");
in.close();
После завершения записи я вижу, что передача завершена, и размер файла в месте назначения такой же, как у источника. Но я не могу открыть файл, и редактор выдает ошибку как
gedit has not been able to detect the character coding.
Please check that you are not trying to open a binary file.
Select a character coding from the menu and try again.
Этот вопрос: Java загружает jpg с использованием JakartaFtpWrapper - делает файл нечитаемым связанным с моим, я верю, но я не мог понять это.
Есть указатели?
2 ответа
Ваш код для копирования полон и полная ерунда на 100%. Канонический способ копирования потока в Java заключается в следующем:
int count;
byte[] buffer = new byte[8192]; // or more if you like
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
Избавься от всего остального пуха. Это просто тратит время и пространство и наносит непоправимый ущерб вашим данным при передаче.
Я вижу много проблем с вашим кодом. Это странный способ прочитать весь файл. например:
in.read(buf);
in.skip(1024);
bytesRead+=1024;
неправильно, in.read(buf)
возвращает количество прочитанных байтов и устанавливает позицию потоков в текущую позицию old-position + n прочитанных байтов. Так что вам не нужно skip
- это ошибка, так как чтение позиционирует поток уже.
Проверьте контрольные суммы файлов, чтобы убедиться, что они одинаковы. (используя md5 или что-то еще) Я почти уверен, что ни контрольные суммы, ни размеры файлов не совпадают.
Вы должны использовать apache commons-io для обработки файлов. В противном случае посмотрите документы Oracle по обработке файлов.