Получение исключения EOF при попытке создать файл в архиве с использованием 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 ответ

Ваша настройка 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

PS: TrueZIP 7.4.2 был выпущен - пожалуйста, обновите ваши зависимости.

Другие вопросы по тегам