如何在不将整个文件解压缩到磁盘的情况下读取HUGE压缩文件的最后n行

时间:2012-06-11 21:44:28

标签: java file-io compression

我想阅读一个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#));

2 个答案:

答案 0 :(得分:1)

您无法对压缩流内容进行随机访问。你需要解压缩到一个临时文件,或者找到一种方法来从流中获取你需要的东西(例如,通过流读取并保留最后N行在内存中,当你到达流的末尾时,你有最后N行。)

答案 1 :(得分:0)

压缩就像解密和二进制反序列化一样,只能从一开始就完成。有一些形式的压缩你可以做到这一点,但只有最简单的形式。 (Zip和Jar不是这些的例子)这是因为除非你读取它们之前的一些字节,否则你不知道字节的含义。

如果要访问压缩的“文件”部分,则需要将其分解为可以单独解压缩的较小部分。