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

使用Apache Commons IO项目中的CountingInputStream :

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

稍后您可以使用countStream.getByteCount().

于 2012-04-17T10:04:58.777 回答
1

对于压缩文件,您会发现 String 不使用整数字节,因此无法回答问题。例如,压缩时一个字节可以占用少于一个字节(否则尝试压缩它就没有意义了)

顺便说一句:通常最好在加密之前压缩数据,因为它通常会更紧凑。只有在其输出是 base 64 或类似的东西时,在加密后压缩数据才会有所帮助。当内容变得可预测时(例如重复序列、常见字符),压缩效果最好,而加密的目的是使数据看起来不可预测。

于 2012-04-17T10:05:14.127 回答