0

ファイルを追加、削除、および読み取るために zip ファイルに頻繁にアクセスする必要があるアプリを開発しています。これらすべてをかなり簡単に実行できることを約束しているため、truezipの使用を検討しています(現在圧縮されているファイルを通過して読み取ることができることが最大の利点です)が、それで遊んでいるとファイルを追加できませんアーカイブ。私のコード:

public void testfunction()
{
    //below create the archive if it doesn't exist
    TFile tFile = new TFile("src\\test\\resources\\archiveTest\\demoZip.zip");
    if (!tFile.exists()) // I get an EOFException here
    {
        tFile.createNewFile();
    }

    TFile innerFile = new TFile("src\\test\\resources\\archiveTest\\demoZip.zip\\someText.txt");
    innerFile.createNewFile(); // also here

    BufferedWriter out = new BufferedWriter(new FileWriter(innerFile));

    out.write("demo text");
    out.close(); // I know this is bad
}

これを実行すると、この単純なことをどのように調整しようとしても、java.io.EOFException が発生します。ファイルが既に作成されていることを確認しようとすると、tFile.exists() メソッドを呼び出したときに例外が発生します。そうでない場合は、後で innerFile を作成しようとしたときに取得します (zip ファイルが既に存在する場合でも)。

注: truezip 原型の例では TApplication クラスを使用していますが、それはできません。私はこのライブラリを箱から出してすぐに使用できる必要があります。アプリケーションの構造を変更することはできないため、アプリケーション自体を TApplication サブクラスにすることは現実的な解決策ではありません (必要に応じて呼び出し側クラスの構造を変更することはできますが)。

現在、私のPOMにはこれらの依存関係が含まれています(私が見つけた例から含まれています):

<dependency>
    <groupId>de.schlichtherle.truezip</groupId>
    <artifactId>truezip-file</artifactId>
    <version>7.4.1</version>
</dependency>
<dependency>
    <groupId>de.schlichtherle.truezip</groupId>
    <artifactId>truezip-driver-zip</artifactId>
    <version>7.4.1</version>
</dependency>
    <dependency>
    <groupId>de.schlichtherle.truezip</groupId>
    <artifactId>truezip-kernel</artifactId>
    <version>7.4.1</version>
</dependency>
<dependency>
    <groupId>de.schlichtherle.truezip</groupId>
    <artifactId>truezip-driver-file</artifactId>
    <version>7.4.1</version>
</dependency>

インターネット上のほとんどの例は、私が持っているよりも多くの知識を前提としているように見えるので、自分が何をしているのかわからないので、アドバイスをいただければ幸いです。

4

1 に答える 1

0

あなたのPOMセットアップは正しいように見えるので、次のように動作するはずです:

public void testfunction()
{
    TFile innerFile = new TFile("src/test/resources/archiveTest/demoZip.zip/someText.txt");

    BufferedWriter out = new BufferedWriter(new FileWriter(innerFile));
    try {
        out.write("demo text");
    } finally {
        out.close();
    }
}

アーカイブ ファイルは仮想ディレクトリであるため、作成するには、TFile.createNewFile() ではなく、TFile.mkdir() を呼び出します。ただし、最初にアーカイブ ファイルを作成する必要はありません。まだ存在しない場合は、自動的に作成されます。

プロジェクトの Maven アーキタイプを使用する場合、さらに多くの例を見つけることができます: http://truezip.java.net/kick-start/index.html

PS: TrueZIP 7.4.2 がリリースされました。依存関係を更新してください。

于 2011-12-13T23:52:48.347 に答える