Загрузка файлов с 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 по обработке файлов.

Другие вопросы по тегам