获取BufferedReader读取的文件的偏移量?

时间:2012-04-17 09:57:37

标签: java io filesize bufferedreader

我正在逐行读取文件。该文件由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

2 个答案:

答案 0 :(得分:4)

使用CountingInputStream项目中的Apache Commons IO

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

稍后您可以使用countStream.getByteCount()获取文件位置。

答案 1 :(得分:1)

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

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