用Java在内存中提取tar.gz文件

时间:2014-02-15 02:45:16

标签: java apache compression tar gz

我正在使用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();
    }

是否有可能不将其提取到单独的文件中,并以某种方式在内存中读取它?也许变成一个巨大的String或什么?

3 个答案:

答案 0 :(得分:6)

您可以使用ByteArrayOutputStream替换文件流。

即。替换这个:

BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(destPath)); //<- I don't want this!

用这个:

ByteArrayOutputStream bout = new ByteArrayOutputStream();

然后在关闭bout后,使用bout.toByteArray()获取字节。

答案 1 :(得分:3)

  

是否有可能不将其提取到单独的文件中,并以某种方式在内存中读取它?也许变成一个巨大的String或什么?

是的确定。

只需替换内部循环中打开文件并使用写入ByteArrayOutputStream ...或一系列此类流的代码写入文件的代码。

从TAR读取的数据的自然表示(如此)将是字节/字节数组。如果字节是正确编码的字符,并且您知道正确的编码,那么您可以将它们转换为字符串。否则,最好将数据保留为字节。 (如果您尝试将非文本数据转换为字符串,或者如果使用错误的字符集/编码进行转换,则可能会破坏它......不可逆转。)

显然,你需要自己思考一些这些问题,但基本的想法应该有用......只要你有足够的堆空间。

答案 2 :(得分:0)

将btoread的值复制到类似

的字符串

String s = String.valueof(byteVar);

和goon将字节值附加到字符串直到文件的末尾达到..