0

我想读取压缩在 zip 文件中的大 txt 文件的最后 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)但它需要 aFile作为参数。不能将 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#));
4

2 回答 2

1

您不能对压缩流内容进行随机访问。你要么需要解压缩到一个临时文件,要么想办法从一个流中得到你需要的东西(例如,当你到达流的末尾时,通过流读取并将最后 N 行保留在内存中,你有最后 N 行)。

于 2012-06-12T12:25:01.020 回答
0

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

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

于 2012-06-12T06:27:18.787 回答