我最近将 Java 版本更新为 JDK7u21。在更新21的发行说明中,明确提到了使用Runtime.exec的问题。
因此,我想更改我的代码以使用 ProcessBuilder。我正在尝试执行其中包含空格的命令。但即使为此使用 ProcessBuilder,我也会到达 C:\Users\Parag.Joshi\Documents,而不是确切的目录。
下面是我的代码:
ProcessBuilder p = new ProcessBuilder("cmd", "/c", "explorer ", "C:\Local Disk D\My Tutorial");
p.start();
Run Code Online (Sandbox Code Playgroud)
我查看了Java 执行路径名中带有空格的命令,但没有得到任何线索。
我有
List<String> commands = Arrays.asList(commandv);
ProcessBuilder pb = new ProcessBuilder("[C:\ffmpeg\ffmpeg.exe, -i, "C:\file\video.mp4",-flags, +loop, -cmp, +chroma, -partitions, +parti4x4+partp8x8+partb8x8, -me_method, umh, -subq, 6, -me_range, 16, -g, 250, -keyint_min, 25, -sc_threshold, 40, -i_qfactor, 0.71, -b_strategy, 1, -threads, 4, -b:v, 200k, , -r, 25, -v, warning, -ac, 1, -ab, 96k, -y, -vf, "scale=640:360", "C:\newVideo\video.mp4"]");
Process proc = pb.start();
Run Code Online (Sandbox Code Playgroud)
如何在java中将进程优先级从“hight”设置为“low”?
我有处理超过 5 分钟的命令行。当我使用 ProcessBuilder 调用命令行时,它会在 5 分钟内完成该命令。
而如果过程超过 5 分钟,则该过程会挂起,并且在我退出该过程之前,过程没有任何改进。
p = new ProcessBuilder("myprogram","with","parameter").start();
p.waitFor();
Run Code Online (Sandbox Code Playgroud)
如果您不明白上述问题,请告诉我?
我想使用 Java Process Builder 在 Windows 操作系统中执行 2 个命令(一个是批处理文件,另一个是 python 脚本)。但不幸的是无法做到这一点。我尝试了很多方法。
List<String> commands = new ArrayList<String>();
commands.add("Testbatch.bat");
commands.add("Python.exe");
commands.add("TestPythonScript.py");
ProcessBuilder probuilder = new ProcessBuilder(commands);
Process process = probuilder.start();
Run Code Online (Sandbox Code Playgroud)
这里它正在执行批处理文件,但不是 python。这里,进程构建器将命令视为参数(第一个命令除外)。还尝试了以下方法但没有运气。
String [] commands={"CMD","/C","Testbatch.bat","Python.exe","TestPythonScript.py"};
ProcessBuilder probuilder = new ProcessBuilder(commands);
Process process = probuilder.start();
Run Code Online (Sandbox Code Playgroud)
使用 ProcessBuilder 按顺序(一个接一个)执行命令对我来说没有任何作用,我几乎花了 3 天但找不到正确的方法。任何人都可以建议我实现相同目标的方法吗?
谢谢,
苏德希尔
尝试通过以下代码以编程方式激活 Python 的virtualenv 时获得以下信息:
java.io.IOException: Cannot run program "." (in directory "/Users/simeon.../..../reporting"): error=13, Permission denied
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at VirtualEnvCreateCmdTest.runCommandInDirectory(VirtualEnvCreateCmdTest.java:30)
at VirtualEnvCreateCmdTest.createVirtEnv(VirtualEnvCreateCmdTest.java:61)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at ......
Caused by: java.io.IOException: error=13, Permission denied
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
at java.lang.ProcessImpl.start(ProcessImpl.java:134)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 25 more
Run Code Online (Sandbox Code Playgroud)
代码:
public class VirtualEnvCreateCmdTest {
private final static Logger LOG = LoggerFactory.getLogger(VirtualEnvCreateCmdTest.class);
private void runCommandInDirectory(String path,String ... command) throws Throwable
{
LOG.info("Running command '"+String.join(" ",command)+"' in path '"+path+"'");
ProcessBuilder builder = new …Run Code Online (Sandbox Code Playgroud) 此命令从命令行成功运行:
// /home/[user]/testproject/target/dependency/testproj-1.0-SNAPSHOT.jar
~/testproject/target/dependency$ jar -xf *.jar
Run Code Online (Sandbox Code Playgroud)
但是当我尝试通过 ProcessBuilder 运行相同的命令时,我得到:
java.io.FileNotFoundException: *.jar (No such file or directory)
Run Code Online (Sandbox Code Playgroud)
流程构建器代码:
ProcessBuilder builder = new ProcessBuilder("jar", "-xf", "*.jar");
builder.directory("/home/[user]/testproject/target/dependency");
Process process = builder.start();
int exitValue = process.waitFor();
Run Code Online (Sandbox Code Playgroud)
如何使其与命令参数中的“*”一起使用?
我对使用线程非常不熟悉,所以我希望有人可以帮我找出最好的方法.
我的java应用程序中有一个JButton ...当你点击按钮时,我有一个Process Builder,它创建一个执行一些外部python代码的进程.python代码生成一些文件,这可能需要一些时间.当python代码完成执行时,我需要将这些文件加载到我的Java应用程序中的applet中.
在其当前形式中,我在调用外部python文件的代码中有一个p.waitFor()...所以当你单击按钮时,按钮会挂起(整个应用程序实际挂起),直到完成该过程.显然,我希望用户能够在此过程进行时与应用程序的其余部分进行交互,但是一旦完成,我希望我的应用程序知道它,以便它可以将文件加载到applet中.
做这个的最好方式是什么?
谢谢你的帮助.
我有一个像下面这样的方法:
public void launch(String cmd, String [] args, String workingDir)
Run Code Online (Sandbox Code Playgroud)
在这个方法中,我调用了ProcessBuilder.
如何调用ProcessBuilder,包括我的args参数中包含的任意数量的args?
例如,像这样:
ProcessBuilder pb = new ProcessBuilder(cmd, args);
Run Code Online (Sandbox Code Playgroud)
我注意到ProcessBuilder确实有这个构造函数:
ProcessBuilder(List<String> command)
Run Code Online (Sandbox Code Playgroud)
也许我可以以某种方式使用它.
我试图通过使用Linux下的ProcessBuilder类将mp3文件解码为wav文件.由于某种原因,该过程不会停止,因此我必须手动取消它.
有人可以给我一个暗示.我认为引用的代码很容易重现:
import java.io.*;
public class Test {
public static void main(String[] args) {
try {
Process lameProcess = new ProcessBuilder("lame", "--decode", "test.mp3", "-").start();
InputStream is = lameProcess.getInputStream();
FileOutputStream fileOutput = new FileOutputStream("test.wav");
DataOutputStream dataOutput = new DataOutputStream(fileOutput);
byte[] buf = new byte[32 * 1024];
int nRead = 0;
int counter = 0;
while((nRead = is.read(buf)) != -1) {
dataOutput.write(buf, 0, buf.length);
}
is.close();
fileOutput.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出jstack
"main" prio=10 tid=0x0000000002588800 nid=0x247a runnable …Run Code Online (Sandbox Code Playgroud) import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
public class TestUnZip {
public static void main(String[] args) throws IOException, InterruptedException{
String destFolder="E:\\TestScript";
/*
* Location where the Nodejs Project is Present
*/
System.out.println(destFolder);
String cmdPrompt="cmd";
String path="/c";
String npmUpdate="npm update";
String npm="npm";
String update="update";
File jsFile=new File(destFolder);
List<String> updateCommand=new ArrayList<String>();
updateCommand.add(cmdPrompt);
updateCommand.add(path);
updateCommand.add(npmUpdate);
runExecution(updateCommand,jsFile);
}
public static void runExecution(List<String> command, File navigatePath) throws IOException, InterruptedException{
System.out.println(command); …Run Code Online (Sandbox Code Playgroud)