#java #executable-jar #delete-file
#java #исполняемый файл-jar #удалить-файл
Вопрос:
Я использую Java-программу для загрузки JAR из частной онлайн-базы данных, а затем запускаю их, используя следующий код:
ProcessBuilder pb = new ProcessBuilder(commands);
File jarFile = new File(JAR_DIR);
pb.directory(jarFile);
Process proc = pb.start();
Банки работают нормально, используя это, но я хотел бы удалить каждый JAR после его использования, потому что их много, и для продолжения их загрузки потребуется слишком много места.
Я распечатывал каждую строку в JAR, а затем ждал ее закрытия (я также пытался уничтожить процесс после ожидания его закрытия):
BufferedReader r = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line;
while(line = r.readLine()) != null)
System.out.println(line);
proc.waitFor();
Затем я удаляю папку, в которой находится JAR, используя метод из org.apache.commons.io.FileUtils:
FileUtils.deleteDirectory(new File(jarDirectory));
Однако при этом возникает исключение, в котором говорится, что файл JAR не может быть удален.
Я думаю, что где-то мне нужно удалить путь к JAR из JVM перед его удалением, но я ничего не нашел о том, как это сделать в другой Java-программе.
Комментарии:
1. Приложения Java все еще работают, когда вы пытаетесь удалить
jar
файл?2. никогда не делал ничего подобного. но, возможно, вам нужно закрыть экземпляры reader (r.close() …) перед удалением
3. Вы можете использовать File.deleteOnExit() для удаления временных файлов jar при завершении работы вашей программы. Хотя у этого возникают проблемы при сбое JVM, это лучший вариант после File.delete() (который у вас не сработал, не знаю почему).
4. Это зависит от JVM, можете ли вы удалить текущие файлы .jar. Oracle JVM под Windows этого не позволяет, и поэтому вам нужно дождаться завершения процессов (доступа к JVM). В Linux я столкнулся с тем, что большинство JVM допускают удаление запущенных или связанных с библиотекой. файлы jar.
5. @JayC667 Это потому, что Linux (или, скорее, уровень файловой системы POSIX) позволяет удалять файлы во время их открытия, чего не делает Windows. JVM просто перенаправляет на базовое поведение.