0

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.

この質問:JakartaFtpWrapperを使用したJavaアップロードjpg-ファイルを判読不能にするのは、私が信じている私のものに関連していますが、私はそれを理解できませんでした。

ポインタはありますか?

4

2 に答える 2

3

あなたのコピーコードは完全で、100%Aグレードのナンセンスです。Javaでストリームをコピーする標準的な方法は次のとおりです。

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

他のすべての綿毛を取り除きます。時間とスペースを浪費し、転送中のデータに明らかに損害を与えています。

于 2013-01-02T06:53:05.607 に答える
2

コードに多くの問題があります。ファイル全体を読み取るのは奇妙な方法です。例えば:

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

が間違っている場合in.read(buf)は、読み取られたバイト数を返し、ストリームの位置を現在の位置に設定します。old-position+ nreadbytes。したがって、必要はありませんskip。読み取りによってストリームがすでに配置されているため、これはエラーです。

ファイルのチェックサムを確認して、それらが同じであることを確認します。(md5などを使用)チェックサムもファイルサイズも同じではないと確信しています。

ファイル処理にはapachecommons-ioを使用する必要があります。それ以外の場合は、ファイル処理に関するoracleドキュメントを参照してください。

于 2013-01-02T06:34:47.067 に答える