2016-01-07 3 views
2

Я читаю tar.gz архив с использованиемКак преобразовать ArchiveEntry в InputStream?

ArchiveEntry entry = tarArchiveInputStream.getNextEntry();

Вопрос: как я могу преобразовать это ArchiveEntry к InputStream, так что я могу на самом деле читать и обрабатывать файл в String?

+0

Чтобы уточнить, вы имеете в виду 'org.apache.commons.compress.archivers.ArchiveEntry' из Викисклада компресса в Apache? – MWiesner

+2

да я имею в виду commons.compress. – membersound

ответ

2

Вы можете использовать IOUtils, чтобы полностью прочитать InputStream:

import org.apache.commons.compress.utils.IOUtils 

byte[] buf = new byte[(int) entry.getSize()]; 
int readed = IOUtils.readFully(tarArchiveInputStream,buf); 

//readed should equal buffer size 
if(readed != buf.length) { 
throw new RuntimeException("Read bytes count and entry size differ"); 
} 

String string = new String(buf, StandardCharsets.UTF_8); 

Если файл находится в другой кодировке, чем UTF-8, использование, что вместо UTF-8 в конструкторе строки.

+1

Это, вероятно, правильное решение, так как 'IOUtils.readFully' можно использовать непосредственно из' commons.compress'. – membersound

2

Это уже InputStream.

byte[] buf = new byte[(int) entry.getSize()]; 
int k = tarArchiveInputStream.read(buf, 0, buf.length); 
String s = new String(buf, 0, k); 
1

Если вы действительно хотите, чтобы прочитать файл один за другим, то TarEntry фактически удерживает объект файла в нем:

Этот класс представляет собой запись в архив Tar. Он состоит из заголовка записи, а также файла записи.

Таким образом, просто инициализировать другой FileInputStream будет достаточно:

import org.apache.commons.io.IOUtils; 
String file = IOUtils.toString(new FileInputStream(entry.getFile()); 
Смежные вопросы