我正在逐行读取文件。该文件由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
答案 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或类似的情况下才有用。当内容变得可预测时(例如重复序列,常见字符),压缩效果最佳,而加密的目的是使数据看起来不可预测。