Финализатор (иначе деструктор) является частью сборки "мусора" (GC) - это неопределенно, когда (или даже если) это происходит, как GC главным образом происходит в результате давления памяти (т.е. нуждаются в большем количестве пространства). Финализаторы обычно только используются для чистки неуправляемый ресурсы, так как управляемые ресурсы будут иметь свой собственный набор/распоряжение.
Следовательно IDisposable
привык к [1 110] детерминировано , очищают объекты, т.е. теперь. Это не собирает память объекта (который все еще принадлежит GC) - но используется, например, для закрытия файлов, соединений с базой данных, и т.д.
существует много предыдущих тем на этом:
Наконец, обратите внимание, что это весьма характерно для IDisposable
объект также иметь финализатор; в этом случае, Dispose()
обычно вызовы GC.SuppressFinalize(this)
, означая, что GC не выполняет финализатор - это просто выбрасывает (намного более дешевую) память. Финализатор все еще работает, если Вы забываете к Dispose()
объект.
Когда Java запущена и вы используете Runtime.exec () с относительным путем, относительные средства относятся к текущему каталогу пользователя, из которого была вызвана JVM.
Это может сработать
Runtime.getRuntime().exec("cmd.exe", "/c", "./com/projct/util/server.bat");
, если вы запускаете java из родительского каталога com.
Или вы должны вычислить абсолютный путь:
Runtime.getRuntime().exec("cmd.exe", "/c",
System.getProperty("user.dir")+"/com/projct/util/server.bat");
Я забыл, прочтите Когда Runtime.exec () не будет .
Для этого можно использовать ProcessBuilder
. Он обеспечивает гораздо больший контроль, чем exec
. В частности, он позволяет установить рабочий каталог с помощью метода directory
.
Пример:
ProcessBuilder pb = new ProcessBuilder("server.bat");
pb.directory(new File(deployDir + "\\com\\project\\util"));
Process p = pb.start();
int exitStatus = p.waitFor();
Конечно, ваше приложение должно откуда-то получать deployDir. Его можно установить в среде, в файле конфигурации приложения, это может быть каталог текущего пользователя или что-то еще.
Вы должны запустить «cmd.exe» с аргументами «/ c» и «server.bat»:
Runtime.getRuntime().exec(new String[] { "cmd.exe", "/c", "server.bat" } );
Plexus utils предоставляет тип командной строки, который может вызывать произвольную командную строку и обрабатывать синтаксический анализ вывода.
Commandline cl = new Commandline();
cl.setExecutable( "cmd.exe" );
cl.createArg().setValue( "/c" );
cl.setWorkingDirectory( new File(System.getProperty("user.dir"),
"/com/project/util/Server.bat"));
cl.createArg().setValue( "/c" );
StreamConsumer consumer = new StreamConsumer() {
public void consumeLine( String line ) {
//do something with the line
}
};
StreamConsumer stderr = new StreamConsumer() {
public void consumeLine( String line ) {
//do something with the line
}
};
int exitCode;
try {
exitCode = CommandLineUtils.execute( cl, consumer, stderr, getLogger() );
} catch ( CommandLineException ex ) {
//handle exception
}
Лучше всего сохранить каталог установки приложения в системе, а затем использовать его для построения ваших путей в приложении. System.getProperty ("user.dir"
Второй параметр для exec - это String [] аргументов для настроек среды (null означает наследование текущих параметров процесса), а третий параметр для exec должен быть файлом, предоставляющим рабочий каталог. . Попробуйте следующее:
Runtime.getRuntime().exec("cmd /c server.bat", null, new File("./com/project/util"));
Вы можете попробовать его с Desktop, если поддерживается (Java 1.6)
File file = new File("server.bat");
Desktop.getDesktop().open(file);