我想阅读一个zip文件中压缩的大文本文件的最后n行而不解压缩。
这就是我现在所拥有的:
ZipFile zf = new ZipFile(file.getAbsolutePath());
Enumeration<?> entries = zf.entries();
ZipEntry ze = (ZipEntry) entries.nextElement();
BufferedReader in = new BufferedReader(new InputStreamReader(zf.getInputStream(ze)));
void readLastNLines(BufferedReader bf){
//some code here
}
我在考虑使用RandomAccessFile(File file, String mode)
的方式,但它需要File
作为参数。 Zip文件不能像目录那样对待,所以我无法传递它。
有什么想法吗?
感谢任何帮助和投入。
谢谢!
[编辑] 我找到了一种效率较低的方法:
由于无法使用RandomAccessFile
,我使用了InputStream
方法:
InputStream is = zf.getInputStream(ze);
int length = is.available();
byte[] bytes = new byte[length];
int ch = -1;
while ((ch = is.read()) != -1) {
bytes[--length] = (byte) ch;
}
String line = new String(bytes);
//reverse the string
String newLine = new StringBuilder(line).reverse().toString();
//Select how many lines do you want(some number = number of bytes)
System.out.println(newLine.substring(line.length()-#some number#));
答案 0 :(得分:1)
您无法对压缩流内容进行随机访问。你需要解压缩到一个临时文件,或者找到一种方法来从流中获取你需要的东西(例如,通过流读取并保留最后N行在内存中,当你到达流的末尾时,你有最后N行。)
答案 1 :(得分:0)
压缩就像解密和二进制反序列化一样,只能从一开始就完成。有一些形式的压缩你可以做到这一点,但只有最简单的形式。 (Zip和Jar不是这些的例子)这是因为除非你读取它们之前的一些字节,否则你不知道字节的含义。
如果要访问压缩的“文件”部分,则需要将其分解为可以单独解压缩的较小部分。