Получение исключения EOF при попытке создать файл в архиве с использованием TrueZip - PullRequest
0 голосов
/ 10 декабря 2011

Я занимаюсь разработкой приложения, которому необходим частый доступ к 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 голосов
/ 14 декабря 2011

Ваша настройка 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выпущен - обновите ваши зависимости.

...