从另一个java文件执行java命令 publicstringrunmsg(字符串文件名、文件路径、int选项) { int x=0; 字符串名称=”,ret=”; 如果(选项==1){ x=文件名.indexOf(“.c”); name=fileName.substring(0,x); command=name+.exeC:\\outtest\\\“+name+.txt”; }否则如果(选项==2){ x=文件名.indexOf(“.cpp”); name=fileName.substring(0,x); command=name+.exeC:\\outtest\\\“+name+.txt”; }否则{ x=fileName.indexOf(“.java”); name=fileName.substring(0,x); command=“java”+name+”C:\\outtest\\“+name+”.txt”; } 字符串输出=executeCommand(命令,路径); } 私有字符串executeCommand(字符串命令,文件路径) { StringBuffer输出=新的StringBuffer(); 过程p; 试一试{ p=Runtime.getRuntime().exec(命令,null,路径); p、 waitFor(); BufferedReader reader1=新的BufferedReader(新的InputStreamReader(p.getErrorStream()); BufferedReader reader2=新的BufferedReader(新的InputStreamReader(p.getInputStream()); //BufferedReader reader3=新的BufferedReader(新的InputStreamReader(p.getOutputStream()); 字符串行=”; 而((line=reader1.readLine())!=null){ 输出。追加(行+“\n”); } 而((line=reader2.readLine())!=null){ 输出。追加(行+“\n”); } }捕获(例外e){ e、 printStackTrace(); } 返回output.toString(); }
我试图从另一个java文件执行从另一个java文件执行java命令 publicstringrunmsg(字符串文件名、文件路径、int选项) { int x=0; 字符串名称=”,ret=”; 如果(选项==1){ x=文件名.indexOf(“.c”); name=fileName.substring(0,x); command=name+.exeC:\\outtest\\\“+name+.txt”; }否则如果(选项==2){ x=文件名.indexOf(“.cpp”); name=fileName.substring(0,x); command=name+.exeC:\\outtest\\\“+name+.txt”; }否则{ x=fileName.indexOf(“.java”); name=fileName.substring(0,x); command=“java”+name+”C:\\outtest\\“+name+”.txt”; } 字符串输出=executeCommand(命令,路径); } 私有字符串executeCommand(字符串命令,文件路径) { StringBuffer输出=新的StringBuffer(); 过程p; 试一试{ p=Runtime.getRuntime().exec(命令,null,路径); p、 waitFor(); BufferedReader reader1=新的BufferedReader(新的InputStreamReader(p.getErrorStream()); BufferedReader reader2=新的BufferedReader(新的InputStreamReader(p.getInputStream()); //BufferedReader reader3=新的BufferedReader(新的InputStreamReader(p.getOutputStream()); 字符串行=”; 而((line=reader1.readLine())!=null){ 输出。追加(行+“\n”); } 而((line=reader2.readLine())!=null){ 输出。追加(行+“\n”); } }捕获(例外e){ e、 printStackTrace(); } 返回output.toString(); },java,swing,command-line,Java,Swing,Command Line,我试图从另一个java文件执行.class文件。.java文件将从位于C:\iptest\input.txt的txt文件中获取输入,并将在以下位置生成一个输出文件C:\outputtest\out.txt,但当我运行此应用程序时,什么都不会发生,应用程序将进入某种无限循环。您尝试过调试吗?还要对输出调用flush()。您也可以尝试ProcessBuilder,也许它更容易一点。顺便说一句,您不执行java文件。您需要一个java OtherClass(不带.class扩展)。@Marc Andr
.class
文件。.java
文件将从位于C:\iptest\input.txt
的txt文件中获取输入,并将在以下位置生成一个输出文件C:\outputtest\out.txt
,但当我运行此应用程序时,什么都不会发生,应用程序将进入某种无限循环。您尝试过调试吗?还要对输出调用flush()。您也可以尝试ProcessBuilder,也许它更容易一点。顺便说一句,您不执行java文件。您需要一个java OtherClass
(不带.class
扩展)。@Marc Andre您提供的链接是我自己的问题-\ux您必须在子进程运行时处理输出。您不能调用p.waitFor()代码>当没有线程来处理进程的输入/输出时。@Marc Andre second code不是一个类,它是一个函数,我使用了相同的函数来编译我的.java文件,该文件运行良好并生成了.class文件。所以我不认为第二个函数有任何问题problem@rick对不起,我对所有的.class和.java都迷路了。Holger是对的,p.waitFor()是阻塞的,若你们不处理线程中的所有内容,你们就不会有任何输出/输入。
public String runMsg(String fileName, File Path, int option)
{
int x = 0;
String name = " ", ret = "";
if (option == 1) {
x = fileName.indexOf(".c");
name = fileName.substring(0, x);
command = name + ".exe < C:\\iptest\\input.txt > C:\\outtest\\" + name + ".txt";
} else if (option == 2) {
x = fileName.indexOf(".cpp");
name = fileName.substring(0, x);
command = name + ".exe < C:\\iptest\\input.txt > C:\\outtest\\" + name + ".txt";
} else {
x = fileName.indexOf(".java");
name = fileName.substring(0, x);
command = "java " + name + " < C:\\iptest\\input.txt > C:\\outtest\\" + name + ".txt";
}
String output = executeCommand(command, Path);
}
private String executeCommand(String command, File Path)
{
StringBuffer output = new StringBuffer();
Process p;
try {
p = Runtime.getRuntime().exec(command, null, Path);
p.waitFor();
BufferedReader reader1 = new BufferedReader(new InputStreamReader(p.getErrorStream()));
BufferedReader reader2 = new BufferedReader(new InputStreamReader(p.getInputStream()));
// BufferedReader reader3 = new BufferedReader(new InputStreamReader(p.getOutputStream()));
String line = "";
while ((line = reader1.readLine()) != null) {
output.append(line + "\n");
}
while ((line = reader2.readLine()) != null) {
output.append(line + "\n");
}
} catch (Exception e) {
e.printStackTrace();
}
return output.toString();
}