尝试使用TrueZip在存档中创建文件时获取EOF异常

时间:2011-12-09 21:53:25

标签: java truezip

我正在开发一个需要经常访问zip文件以添加,删除和读取文件的应用。我正在考虑使用truezip,因为它承诺我可以相当容易地完成所有这些(能够传递arond并从当前压缩文件中读取它提供的最大优势)但是在玩它时我无法添加文件到档案。我的代码:

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>

所以我不知道我在做什么,所以我能得到的任何建议都会受到赞赏,因为互联网上的大多数例子似乎都比我拥有更多的知识。

1 个答案:

答案 0 :(得分: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.mkdir(),而不是TFile.createNewFile()。 但是,不需要首先创建存档文件。如果它尚不存在,它将自动生成。

使用项目的Maven原型时,您可以找到更多示例:http://truezip.java.net/kick-start/index.html

P.S。:TrueZIP 7.4.2已经发布 - 请更新您的依赖项。