Извлечь файл 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 добавляя значение байта к строке до конца файла..

Другие вопросы по тегам