我创建了一个独立的应用程序,我希望当用户点击运行按钮时,终端应该打开,并且应该在终端上执行特定的命令.我可以使用以下代码成功打开终端...
Process process = null;
try {
process = new ProcessBuilder("xterm").start();
} catch (IOException ex) {
System.err.println(ex);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码打开一个终端窗口,但我无法对其执行任何命令.谁能告诉我怎么做?
我一直试图弄清楚如何使用new管道Java中的一些进程ProcessBuilder.我找不到一个合适的例子来说明我想做什么,当我尝试自己做这个过程时,这个过程就会挂起.我将非常感谢一些代码运行相当于cat test.txt | wc但不是通过shell的代码.
--Update--
好的,只是澄清一下.我知道有一些方法可以通过读写流来模拟管道.我想知道是否通过Java 7中引入的redirectInput和redirectOutput方法以某种自动方式完成.
快速连续的另一个问题,但这是一个我没有看到的非常明显的错误.我已经编写了一些代码来运行下面的批处理文件,但是我收到一条错误消息,说它无法找到该文件,但我可以向您保证该文件确实存在于该目录中!
public class Pull {
public void pullData() throws IOException {
ProcessBuilder pb = new ProcessBuilder("adb.bat");
File f = new File("C:\\");
pb.directory(f);
Process p = pb.start();
}
public static void main(String[] args) throws IOException {
Pull pull = new Pull();
pull.pullData();
}
Run Code Online (Sandbox Code Playgroud)
}
这是错误信息
Exception in thread "main" java.io.IOException: Cannot run program "adb.bat" (in directory "C:\"): CreateProcess error=2, The system cannot find the file specified
Run Code Online (Sandbox Code Playgroud) 请转到第二次更新.我不想改变此问题的先前背景.
我正在使用Java应用程序中的wkhtmltoimage.
使用它的标准方法是 - path-to-exe http://url.com/ image.png.
根据他们的文档,如果我们写一个-而不是输入URL,输入转移到STDIN.
我正在使用ProcessBuilder- 开始这个过程-
ProcessBuilder pb = new ProcessBuilder(exe_path, " - ", image_save_path);
Process process = pb.start();
Run Code Online (Sandbox Code Playgroud)
现在我无法弄清楚如何将输入流传递给此进程.
我有一个模板文件读入a DataInputStream,我在最后附加一个字符串:
DataInputStream dis = new DataInputStream (new FileInputStream (currentDirectory+"\\bin\\template.txt"));
byte[] datainBytes = new byte[dis.available()];
dis.readFully(datainBytes);
dis.close();
String content = new String(datainBytes, 0, datainBytes.length);
content+=" <body><div id='chartContainer'><small>Loading chart...</small></div></body></html>";
Run Code Online (Sandbox Code Playgroud)
我怎么管content的STDIN过程中?
UPDATE ---
在Andrzej Doyle的回答之后:
我用过了getOutputStream()这个过程:
ProcessBuilder pb = new ProcessBuilder(full_path, " - ", image_save_path);
pb.redirectErrorStream(true); …Run Code Online (Sandbox Code Playgroud) 我想将多个参数传递给processBuilder,并将参数分隔为空格.
这是命令,
String[] command_ary = {dir+"library/crc"," -s ", fileName," ",addressRanges};
Run Code Online (Sandbox Code Playgroud)
我需要在"fcrc"之后和"-p"之后以及"filename"和"addressRange"之间提供一个空格.
谢谢
我有以下Windows批处理文件(run.bat):
@echo off
echo hello batch file to sysout
Run Code Online (Sandbox Code Playgroud)
以下java代码,它运行批处理文件并将输出重定向到文件:
public static void main(String[] args) throws IOException {
System.out.println("Current java version is: " + System.getProperty("java.version"));
ProcessBuilder pb =
new ProcessBuilder("cmd.exe", "/c",
"run.bat"
,">>", "stdout.txt","2>>", "stderr.txt"
);
System.out.println("Command is: " + pb.command());
Process proc = pb.start();
InputStream in = proc.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
int exitValue = proc.exitValue();
System.out.println("Exit value: " + exitValue);
}
Run Code Online (Sandbox Code Playgroud)
在JDK上,包括JDK6u43,我得到以下输出:
Current …Run Code Online (Sandbox Code Playgroud) 我有两个程序:
第二个程序代码如下所示:
String[] arguments = {
"cmd", "/c",
"java", "-cp", classPath
lauchClass,
// Arguments for first program
}
ProcessBuilder pb = new ProcessBuilder(arguments);
pb.environment().putAll(System.getenv());
pb.directory(workDir);
pb.inheritIO();
Process process = pb.start();
process.waitFor();
Run Code Online (Sandbox Code Playgroud)
当第一个程序从第二个程序开始时,System.console()为空,它随NPE失败.
所以,问题是:有没有办法运行System.console()的另一个进程?
我遇到了一个奇怪的Java问题ProcessBuilder.代码如下所示(略微简化)
public class Whatever implements Runnable
{
public void run(){
//someIdentifier is a randomly generated string
String in = someIdentifier + "input.txt";
String out = someIdentifier + "output.txt";
ProcessBuilder builder = new ProcessBuilder("./whateveer.sh", in, out);
try {
Process process = builder.start();
process.waitFor();
} catch (IOException e) {
log.error("Could not launch process. Command: " + builder.command(), e);
} catch (InterruptedException ex) {
log.error(ex);
}
}
}
Run Code Online (Sandbox Code Playgroud)
whatever.sh读取:
R --slave --args $1 $2 <whatever1.R >> r.log
Run Code Online (Sandbox Code Playgroud)
大量的实例Whatever被提交到ExecutorService …
我试图在java中为进程构建器设置PATH环境变量,我尝试了以下方法:
ProcessBuilder pb = new ProcessBuilder(command);
Map<String, String> mp = pb.environment();
mp.put("Path", "myPath");
pb.start();
Run Code Online (Sandbox Code Playgroud)
但是以下不起作用,进程构建器选择了默认的系统路径.我遇到了这个问题,这个技巧在我目前的项目中并没有帮助我.我该怎么办才能解决这个问题?
我正在从JAVA ProcessBuilder调用一些EXE(7za.exe,pg_basebackup.exe,...).它在2或3天内没有任何问题(EXE将每天调用).之后,EXE不断崩溃.
7za.exe错误:
退出代码:: -1.073.741.502Windows事件日志错误:
错误应用程序名称:7za.exe,版本:9.20.0.0,时间戳:0x4ce553f5错误模块名称:KERNELBASE.dll,版本:6.2.9200.21941,时间戳:0x5792e533
异常代码:0xc0000142
错误偏移量:0x000683ba
错误进程ID:0x10bc
错误应用程序启动时间:0x01d2cebdff3bb05a
错误应用程序路径:EXEpath\bin\7za.exe
错误模块路径:KERNELBASE.dll
报告ID:3d27046a-3ab1-11e7-93fe-00505680156e
错误包全名:
错误包相关应用程序ID:
代码段
File workingDir = new File(workingDirectory);
ProcessBuilder pb = new ProcessBuilder(argumentsList);
pb.redirectErrorStream(true);
pb.directory(workingDir);
Process process = pb.start();
BufferedReader commandOutput = new BufferedReader(new
InputStreamReader(process.getInputStream()));
String s = null;
while ((s = commandOutput.readLine()) != null) {
print(s);
}
int exitCode = process.exitValue();
Run Code Online (Sandbox Code Playgroud)
在运行此代码的所有机器中也没有发生这种情况.是内存泄漏还是操作系统级错误?请指教.
提前致谢.
编辑1:c#中的同类错误.它还包含修复.
https://social.msdn.microsoft.com/Forums/vstudio/en-US/cb9a15ed-4401-47f1-8c78-0c63c3da677d/process-returns-0xc0000142-when-started-from-a-windows-service-prividing- the credentials?forum = clr
如何在java中实现它?
编辑2:Java作为服务运行(使用包装器)
Java版本:1.0.051
Windows版本:Windows Server 2012和R2(64位),Windows 7(64位),Windows 8(64位)
java ×10
processbuilder ×10
linux ×2
process ×2
batch-file ×1
command ×1
exe ×1
java-io ×1
jdk1.6 ×1
pipe ×1
stdin ×1
terminal ×1
windows ×1
wkhtmltopdf ×1