Я хочу прочитать последние n строк большого файла txt, сжатого в zip-файле, без его разархивирования.Как читать последние n строк HUGE сжатого файла без распаковки всего файла на диск
Это то, что я сейчас:
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-файл не может рассматриваться как каталог, поэтому я не могу его передать.
Любые идеи?
Оцените любую помощь и ввод.
Спасибо!
[EDIT] я выяснить менее эффективный способ достижения этой цели:
Поскольку 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#));
Это огромная боль в заднице. Посмотрите эту тему http://stackoverflow.com/a/7322581/1417974 –
вы не можете делать произвольный доступ к содержимому сжатого потока. вам нужно либо распаковать временный файл, либо выяснить, как получить то, что вам нужно, от одного прохода через поток (например, прочитать поток и сохранить последние N строк в памяти, когда вы дойдете до конца потока, у вас есть последние N строк). – jtahlborn
@jtahlborn Это должен быть ответ –