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)a が必要です。Filezipファイルはディレクトリのように扱うことができないため、渡すことができません。

何か案は?

支援と入力に感謝します。

ありがとう!

[編集]これを達成するための効率の悪い方法を見つけました:

使用できないため、次のアプローチ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

0

復号化やバイナリ デシリアライゼーションなどの圧縮は、最初からしか実行できません。これを行うことができるいくつかの形式の圧縮がありますが、最も単純な形式のみです。(Zip と Jar はこれらの例ではありません) これは、それらの前のバイトの一部、多くの場合すべてを読み取らない限り、バイトの意味がわからないためです。

圧縮された「ファイル」の一部にアクセスしたい場合は、個別に解凍できる小さな部分に分割する必要があります。

于 2012-06-12T06:27:18.787 に答える