1

私はファイルを1行ずつ読んでいます。ファイルはによってエンコードされCipherOutputStream、後でによって圧縮されDeflaterOutputStreamます。ファイルは、ロシア語の文字などのUTF-8文字で構成できます。

br.ReadLine()実際に読み取ったファイルのオフセット、またはコマンドで読み取ったバイト数を取得したい。問題は、ファイルが暗号化され、収縮されているため、読み取り文字列の長さがファイル内の読み取りバイト数よりも長いことです。

            InputStream fis=tempURL.openStream();                       //in tempURL I've got an URL to download
            CipherInputStream cis=new CipherInputStream(fis,pbeCipher); //CipherStream
            InflaterInputStream iis=new InflaterInputStream(cis);       //InflaterInputStream
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(iis, "UTF8"));                //BufferedReader
            br.readLine();

            int fSize=tempURL.openConnection().getContentLength();      //Catch FileSize
4

2 に答える 2

4

Use a CountingInputStream from the Apache Commons IO project:

InputStream fis=tempURL.openStream();
CountingInputStream countStream = new CountingInputStream(fis);
CipherInputStream cis=new CipherInputStream(countStream,pbeCipher);
...

Later you can obtain the file position with countStream.getByteCount().

于 2012-04-17T10:04:58.777 に答える
1

圧縮ファイルの場合、文字列が整数バイトを使用していないため、質問に答えることができないことがわかります。たとえば、1 バイトは圧縮時に 1 バイト未満で済む場合があります (そうしないと、圧縮しようとしても意味がありません)。

ところで:通常、データはよりコンパクトになるため、暗号化するにデータを圧縮するのが最善です。暗号化後にデータを圧縮すると、出力が base 64 などの場合にのみ役立ちます。圧縮は、コンテンツが予測可能 (繰り返しシーケンス、一般的な文字など) になる場合に最適に機能しますが、暗号化の目的は、データを予測不可能に見せることです。

于 2012-04-17T10:05:14.127 に答える