0

TarInputStream() を使用して tar ファイルの内容を読み取り、そこからすべてのファイルを特定の場所に保存しています。tar ファイルに似た名前のフォルダーを作成し、すべてのファイルをそのフォルダーに保存したいと考えています。たとえば、ファイル test1 と test2 を含む tar ファイル test.tar.gz がある場合、コードは test という名前でフォルダーを作成し、そのフォルダーに tar ファイルを抽出する必要があります。

これが私が書いたコードです。

TarInputStream tin = new TarInputStream(new GZIPInputStream(new FileInputStream(new File(tarFileName))));

TarEntry tarEntry = tin.getNextEntry();
        while (tarEntry != null) {// create a file with the same name as tar entry

            File destPath = new File(dest.toString() + File.separatorChar
                    + tarEntry.getName());

            FileOutputStream fout = new FileOutputStream(destPath);
                tin.copyEntryContents(fout);
                fout.close();
                ///services/advert/lpa/dimenions/data/advertiser/
                Path inputFile = new Path(destPath.getAbsolutePath());

                //To remove the local files set the flag to true
                fs.copyFromLocalFile(inputFile, filenamepath); 
                tarEntry = tin.getNextEntry();
}
4

1 に答える 1

1

私はあなたnew File(...)をに変更します(あなたのコードのどこから来ているのかわからない -であるとnew File(dest, tarEntry.getName());仮定します)。destFile

そして最も重要なことは、ファイルを作成しようとしているディレクトリを作成していることを確認する必要があることです。これは次の方法で実行できます。

destPath.getParent().mkdirs();

ファイル名の各部分に対してフォルダーを作成することはできないため、これ.getParent()は重要です。そうしないと、ファイル名もファイルではなくフォルダーとして作成され、そこにデータを書き込もうとすると失敗します (ファイルが存在するフォルダの代わりに期待されます)。

次のようなものから「ベース」lpa_1_454_20111117011749名を取得する場合lpa_1_454_20111117011749.tar.gz

String tarFileName = "/tmp/lpa_1_454_20111117011749.tar.gz";

// Non-regular expression approach:
{
    int lastPath = tarFileName.lastIndexOf('/');
    if(lastPath >= 0){
        lastPath++;
    }
    int endName = tarFileName.length();
    if(tarFileName.endsWith(".tar.gz")){
        endName -= 7;
    }

    String baseName = tarFileName.substring(lastPath, endName);
    System.out.println(baseName);
}

// Regular expression approach:
{
    Pattern p = Pattern.compile("(?:.*/|^)(.*)\\.tar\\.gz");
    Matcher m = p.matcher(tarFileName);
    if(m.matches()){
        System.out.println(m.group(1));
    }
}

どちらのアプローチの出力:

lpa_1_454_20111117011749
于 2011-12-27T20:33:37.727 に答える