복붙노트

[HADOOP] 지역 사용하여 자바로 FTP에서 파일을 다운로드하면 파일을 읽을 수 있습니다 - 인코딩 문제를

HADOOP

지역 사용하여 자바로 FTP에서 파일을 다운로드하면 파일을 읽을 수 있습니다 - 인코딩 문제를

나는이 FTP에서 매우 큰 파일을 읽고 자바를 사용하여 로컬 컴퓨터에 기록하는 코드를 개발했다. 다음을 수행하는 코드입니다. 이것은 CustomInputFormat의 RecordReader 내부의 다음 (텍스트 키, 텍스트 값)에서 일부입니다

 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.

이 질문 : JakartaFtpWrapper를 사용하여 Java 업로드 도트 JPG - 내가 믿는 내 관련이 파일을 읽을 수 있습니다,하지만 난 그것의 의미가 없습니다.

모든 포인터?

해결법

  1. ==============================

    1.귀하의 코드를 복사가 완료되고 100 %에게 등급 넌센스 발언. 다음과 같이 자바에서 스트림을 복사 할 수있는 표준 방법입니다 :

    귀하의 코드를 복사가 완료되고 100 %에게 등급 넌센스 발언. 다음과 같이 자바에서 스트림을 복사 할 수있는 표준 방법입니다 :

    int count;
    byte[] buffer = new byte[8192]; // or more if you like
    while ((count = in.read(buffer)) > 0)
    {
      out.write(buffer, 0, count);
    }
    

    다른 모든 보풀을 제거. 그것은 단지 시간과 공간을 낭비하고 명확하게 전송중인 데이터를 손상된다.

  2. ==============================

    2.난 당신의 코드에 많은 문제를 참조하십시오. 그것은 전체 파일을 읽을 수있는 이상한 방법입니다. 예를 들어 :

    난 당신의 코드에 많은 문제를 참조하십시오. 그것은 전체 파일을 읽을 수있는 이상한 방법입니다. 예를 들어 :

    in.read(buf);
    in.skip(1024);
    bytesRead+=1024;
    

    잘못, in.read (버피)는 읽은 바이트 수를 반환하고 + N 바이트를 읽어 현재 위치 예전 위치로 스트림 위치를 설정합니다. 그래서 당신은 건너 뛸 필요가 없습니다 - 오류 이잖아, 읽기가 이미 스트림을 배치한다.

    파일의 체크섬이 확실하게 확인합니다, 그들은 동일합니다. (MD5 또는 뭔가를 사용) 나는 어느 체크섬 확신 않으며, filesizes은 동일합니다.

    당신은 파일 처리를 위해 아파치 평민-IO를 사용해야합니다. 그렇지 않으면 파일 처리에 오라클 문서 봐.

  3. from https://stackoverflow.com/questions/14117719/downloading-files-from-ftp-to-local-using-java-makes-the-file-unreadable-encod by cc-by-sa and MIT license