3

「.tar」ファイルを解凍するために Apache Commons 1.4.1 ライブラリを使用しています。

問題:すべてのファイルを抽出する必要はありません。tar アーカイブ内の特定の場所から特定のファイルを抽出する必要があります。TAR ファイルのサイズが約 300 MB であるため、いくつかの .xml ファイルのみを抽出する必要があり、コンテンツ全体を解凍するとリソースが無駄になります。

ネストされたディレクトリの比較を行う必要があるかどうか、または回避策があるかどうか、私は立ち往生して混乱していますか?

注: .XML (必要なファイル) の場所は常に同じです。

TAR の構造は次のとおりです。

directory:E:\Root\data
 file:E:\Root\datasheet.txt
directory:E:\Root\map
     file:E:\Root\mapers.txt
directory:E:\Root\ui
     file:E:\Root\ui\capital.txt
     file:E:\Root\ui\info.txt
directory:E:\Root\ui\sales
     file:E:\Root\ui\sales\Reqest_01.xml
     file:E:\Root\ui\sales\Reqest_02.xml
     file:E:\Root\ui\sales\Reqest_03.xml
     file:E:\Root\ui\sales\Reqest_04.xml
directory:E:\Root\ui\sales\stores
directory:E:\Root\ui\stores
directory:E:\Root\urls
directory:E:\Root\urls\fullfilment
     file:E:\Root\urls\fullfilment\Cams_01.xml
     file:E:\Root\urls\fullfilment\Cams_02.xml
     file:E:\Root\urls\fullfilment\Cams_03.xml
     file:E:\Root\urls\fullfilment\Cams_04.xml
directory:E:\Root\urls\fullfilment\profile
directory:E:\Root\urls\fullfilment\registration
     file:E:\Root\urls\options.txt
directory:E:\Root\urls\profile

制約:私は JDK 7 を使用できず、Apache コモンズ ライブラリに固執する必要があります。

私の現在の解決策:

public static void untar(File[] files) throws Exception {
        String path = files[0].toString();
        File tarPath = new File(path);
        TarEntry entry;
        TarInputStream inputStream = null;
        FileOutputStream outputStream = null;
        try {
            inputStream = new TarInputStream(new FileInputStream(tarPath));
            while (null != (entry = inputStream.getNextEntry())) {
                int bytesRead;
                System.out.println("tarpath:" + tarPath.getName());
                System.out.println("Entry:" + entry.getName());
                String pathWithoutName = path.substring(0, path.indexOf(tarPath.getName()));
                System.out.println("pathname:" + pathWithoutName);
                if (entry.isDirectory()) {
                    File directory = new File(pathWithoutName + entry.getName());
                    directory.mkdir();
                    continue;
                }
                byte[] buffer = new byte[1024];
                outputStream = new FileOutputStream(pathWithoutName + entry.getName());
                while ((bytesRead = inputStream.read(buffer, 0, 1024)) > -1) {
                    outputStream.write(buffer, 0, bytesRead);
                }
                System.out.println("Extracted " + entry.getName());
            }

        }
4

1 に答える 1

3

TARファイル形式は、ストリームとして (つまり、テープ ドライブとの間で) 書き込みまたは読み取りを行うように設計されており、集中型のヘッダーはありません。いいえ、ファイル全体を読み取って個々のエントリを抽出する方法はありません。

ランダム アクセスが必要な場合は、ZIP 形式を使用し、JDK のZipFile. 十分な仮想メモリがあると仮定すると、ファイルはメモリ マップされ、ランダム アクセスが非常に高速になります (メモリ マップできない場合にランダム アクセス ファイルを使用するかどうかは調べていません)。

于 2013-01-22T17:55:49.283 に答える