Получение исключения 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 был выпущен - пожалуйста, обновите ваши зависимости.