Извлечь файл tar.gz в память на Java
Я использую библиотеку Apache Compress для чтения файла.tar.gz, что-то вроде этого:
final TarArchiveInputStream tarIn = initializeTarArchiveStream(this.archiveFile);
try {
TarArchiveEntry tarEntry = tarIn.getNextTarEntry();
while (tarEntry != null) {
byte[] btoRead = new byte[1024];
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(destPath)); //<- I don't want this!
int len = 0;
while ((len = tarIn.read(btoRead)) != -1) {
bout.write(btoRead, 0, len);
}
bout.close();
tarEntry = tarIn.getNextTarEntry();
}
tarIn.close();
}
catch (IOException e) {
e.printStackTrace();
}
Можно ли не извлечь это в отдельный файл, а как-то прочитать в памяти? Может быть, в гигантскую строку или что-то?
3 ответа
Можно ли не извлечь это в отдельный файл, а как-то прочитать в памяти? Может быть, в гигантскую строку или что-то?
Да конечно.
Просто замените код во внутреннем цикле, который открывает файлы и записывает в них код, который записывает в ByteArrayOutputStream
... или серия таких потоков.
Естественным представлением данных, которые вы читаете из TAR (например), будут байты / байтовые массивы. Если байты являются правильно закодированными символами, и вы знаете правильную кодировку, то вы можете преобразовать их в строки. В противном случае лучше оставить данные в байтах. (Если вы пытаетесь преобразовать нетекстовые данные в строки, или если вы конвертируете, используя неправильную кодировку / кодировку, вы можете искажать их... необратимо.)
Очевидно, что вам нужно будет самостоятельно продумать некоторые из этих вопросов, но основная идея должна работать... при условии, что у вас достаточно места в куче.
Вы можете заменить файловый поток на ByteArrayOutputStream
,
т.е. заменить это:
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(destPath)); //<- I don't want this!
с этим:
ByteArrayOutputStream bout = new ByteArrayOutputStream();
а потом после закрытия bout
использовать bout.toByteArray()
чтобы получить байты.
Скопировать значение btoread в строку типа
String s = String.valueof(byteVar);
и goon добавляя значение байта к строке до конца файла..