我是一个非常新的线程世界的人,一直试图解决这个问题一个星期了.
Thread类中的run方法由于某种原因没有被调用,我不知道为什么(但是很想知道)
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("/bin/sh", "-c", "echo \"w30000001z,none,16488,,181075\nw30000001z,none,16488,,181082\n\" | /home/beehive/bin/exec/tableSize");
Process process = processBuilder.start();
process.waitFor();
InputStream stdin = process.getInputStream();
OutputStream stdout = process.getOutputStream();
InputStream stderr = process.getErrorStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stdin));
BufferedReader error = new BufferedReader(new InputStreamReader(stderr));
StreamGobbler errorStream = new StreamGobbler(process.getErrorStream(), "ERROR");
StreamGobbler outputStream = new StreamGobbler(process.getInputStream(), "OUTPUT");
errorStream.start();
outputStream.start();
errorStream.join();
outputStream.join();
Run Code Online (Sandbox Code Playgroud)
tableSize是一个python可执行文件,它通过stdin获取输入,处理它并输出几行文本.我需要收集此输出并对其进行进一步处理.
有一个单独的线程来处理inputStream和errorStream上的输出.该线程类如下所示.
/* StreamGobbler.java */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
class StreamGobbler extends Thread
{ …Run Code Online (Sandbox Code Playgroud) 我ThMapInfratab1-2.exe在C:\Users\Infratab Bangalore\Desktop\Rod目录下有一个文件.我按照以下方式在命令提示符下执行.它工作正常.
C:\Users\Infratab Bangalore\Desktop\Rod>ThMapInfratab1-2.exe TMapInput.txt
Run Code Online (Sandbox Code Playgroud)
我想用Java技术做同样的程序.使用StackOverFlow伙伴,我试过两种方式.
情况1:
用getRuntime().
import java.util.*;
import java.io.*;
public class ExeProcess
{
public static void main(String args[]) throws IOException
{
Runtime rt = Runtime.getRuntime();
File filePath=new File("C:/Users/Infratab Bangalore/Desktop/Rod");
String[] argument1 = {"TMapInput.txt"};
Process proc = rt.exec("ThMapInfratab1-2.exe", argument1, filePath);
}
}
Run Code Online (Sandbox Code Playgroud)
案例2:
运用 ProcessBuilder
import java.io.File;
import java.io.IOException;
public class ProcessBuilderSample {
public static void main(String args[]) throws IOException
{
String executable = "ThMapInfratab1-2.exe";
String argument1 = …Run Code Online (Sandbox Code Playgroud) ProcessBuilder pb = new ProcessBuilder(commandInformation);
Process process = pb.start();
Run Code Online (Sandbox Code Playgroud)
上面的代码返回错误:
java.lang.IllegalArgumentException
at java.lang.ProcessImpl.<init>(ProcessImpl.java:69)
at java.lang.ProcessImpl.start(ProcessImpl.java:30)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
at com.ConvertsImages.SystemCommandExecutor.executeCommand(SystemCommandExecutor.java:51)
at com.ConvertsImages.ImageConversion.runConvertCommand(ImageConversion.java:115)
at com.ConvertsImages.ImageConversion.runConvert(ImageConversion.java:80)
at com.ConvertsImages.ImageConversion.main(ImageConversion.java:26)
Run Code Online (Sandbox Code Playgroud)
List commandInformation只有一个条目如下:
["D:\Program Files\ImageMagick-6.8.6-Q16\convert.exe" "D:\ConvertFiles\ReImport_2507_1.jpg" -resize 40x40 "D:\ConvertFiles\proxy-40\ReImport_2507_1.jpg.jpg" ]
Run Code Online (Sandbox Code Playgroud)
请建议.
我正在尝试使用Java来查找计算机上安装的Java版本.我有:
List<String> commands = new ArrayList<String>();
commands.add("java.exe");
commands.add("-version");
ProcessBuilder pb = new ProcessBuilder(commands);
pb.directory(new File("C:\\Program Files\\Java\\jdk1.6.0_45\\bin"));
Process p = pb.start();
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((s = stdInput.readLine()) != null) {
System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)
但是,运行此命令时,由于stdInput为空,因此永远不会执行while循环.如果我取出commands.add("-version")它,它将获得在命令行上运行"java.exe"命令时输出的输入,因此似乎添加-version争论导致问题,这也表明目录和java.exe命令是正确的.任何帮助,将不胜感激.
我正在尝试使用流程构建器在我的 Java 应用程序中执行可视化基本脚本代码。由于用户提供的脚本可能无法及时完成执行,我想提供一种方法来限制此执行时间。在下面的代码中,你可以看到我的逻辑,但它并没有真正做它应该做的。我怎样才能使这个等待工作以限制执行时间?
private void run(String scriptFilePath) throws ScriptPluginException {
BufferedReader input = null;
BufferedReader error = null;
try {
ProcessBuilder p = new ProcessBuilder("cscript.exe", "//U", "\"" + scriptFilePath + "\"");
String path = "";
if (scriptFilePath.indexOf("/") != -1) {
path = scriptFilePath.substring(0, scriptFilePath.lastIndexOf("/"));
}
path += "/" + "tempvbsoutput.txt";
p.redirectOutput(new File(path));
Process pp = p.start();
try {
pp.waitFor(executionTimeout, TimeUnit.MINUTES);
} catch (InterruptedException e) {
SystemLog.writeError(jobId, ScriptConsts.COMPONENT_ID, "VBScriptExecutor", "run", 80401104,
"VB Script executes fail.");
}
if (!pp.isAlive()) {
pp.getOutputStream().close();
} …Run Code Online (Sandbox Code Playgroud)