我正在做一个简单的java编译器。我的程序正在运行,但如果它要扫描,它将不会收到输入并将冻结。
我编译器的一个小代码
public class ProcessBuilderMultipleCommandsExample {
static String backSlashFl = "C:\\Users\\xxA\\Desktop";
public static void main(String[] args) throws InterruptedException,
IOException {
// multiple commands
// /C Carries out the command specified by string and then terminates
ProcessBuilder pbC = new ProcessBuilder( //COMPİLE
"cmd.exe", "/c", "cd " + backSlashFl + "&& javac " + "Test" + ".java");
Process processC = pbC.start();
ProcessBuilder pb = new ProcessBuilder( //RUN
"cmd.exe", "/c", "cd " + backSlashFl + "&& java " + "Test");
Process process = pb.start();
IOThreadHandler outputHandler = new IOThreadHandler(
process.getInputStream());
outputHandler.start();
process.waitFor();
System.out.println(outputHandler.getOutput());
}
private static class IOThreadHandler extends Thread {
private InputStream inputStream;
private StringBuilder output = new StringBuilder();
IOThreadHandler(InputStream inputStream) {
this.inputStream = inputStream;
}
public void run() {
Scanner br = null;
try {
br = new Scanner(new InputStreamReader(inputStream));
String line = null;
while (br.hasNextLine()) {
line = br.nextLine();
output.append(line
+ System.getProperty("line.separator"));
}
} finally {
br.close();
}
}
public StringBuilder getOutput() {
return output;
}
}
}
我认为它在后面工作,但我如何获得输入部分?
这是我要编译和运行的文件。
import java.awt.*;
import java.awt.event.*;
import java.util.Scanner;
public class numberScan {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("Enter the number: ");
int a=scan.nextInt();
System.out.println("Number= " + a);
}
}
我在等你的帮忙。
Editted
现在,当我运行GUI时,按下Run键。你觉得我应该怎么做?
buttonRun.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String backSlashFl = file.getAbsolutePath().replace("\\", "\\\\");
backSlashFl = backSlashFl.replace(flName + ".java", "");
try {
execute("cmd.exe", "/c", "cd " + backSlashFl + " && java " + flName);
JOptionPane.showMessageDialog(null, "Dosya çalıştı!","Bilgilendirme",
JOptionPane.INFORMATION_MESSAGE);
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException ae) {
// TODO Auto-generated catch block
ae.printStackTrace();
} catch (Exception e2){
e2.printStackTrace();
}
}
});
当GUI应用程序运行时,此运行按钮仍然存在。
答案 0 :(得分:1)
给定代码存在几个问题。我试图将其压缩成评论,但现在决定将其扩展为答案:
要编译的类名为numberScan
,但显然存储在名为Test.java
的文件中。公共类只能存储在与该类同名的文件中。调用课程NumberScan
,然后调用文件NumberScan.java
。
您只是尝试打印输入流提供的输出。但您不打印错误流提供的结果(因此如果有错误,您将看不到它们!)。此外,您只打印了Process process
的输出(用于运行程序)。您没有打印用于编译程序的Process processC
的输出。
您没有看到任何输出的原因是该行
System.out.println(outputHandler.getOutput());
在执行过程完成之前执行。您使用了waitFor
,但output
由不同的帖子填充 - 即IOThreadHandler
。 getOutput
方法只能在 IOThreadHandler
完成后调用,但如果您想要不断更新输出,那么这将无效。
您想要实现的目标尚不完全清楚,但从您提供的代码中猜测,您的目标似乎是创建一个程序
System.in
。最后两点特别难以手动获得。您必须设置线程以读取输入流和错误流。这些将需要一些技巧来确保在执行程序时连续读取数据。此外,您必须设置一个线程,将用户输入的数据转发到在其自己的进程中执行的Java程序。
幸运的是,所有这些在Java 7中变得相当简单:您只需为所有流设置适当的ProcessBuilder.Redirect
(即重定向INHERIT
),以便将所有流映射到周围程序的相应流。
以下是一个例子:
import java.io.IOException;
import java.lang.ProcessBuilder.Redirect;
import java.util.Arrays;
public class ProcessBuilderMultipleCommandsExample {
private static String path = "C:\\Users\\xxA\\Desktop";
public static void main(String[] args)
throws InterruptedException, IOException {
execute("cmd.exe", "/c", "cd " + path + " && javac " + "NumberScan" + ".java");
execute("cmd.exe", "/c", "cd " + path + " && java " + "NumberScan");
}
private static void execute(String ... commands)
throws IOException, InterruptedException
{
System.out.println("Executing "+Arrays.asList(commands));
ProcessBuilder processBuilder = new ProcessBuilder(commands);
processBuilder.redirectInput(Redirect.INHERIT);
processBuilder.redirectOutput(Redirect.INHERIT);
processBuilder.redirectError(Redirect.INHERIT);
Process process = processBuilder.start();
process.waitFor();
}
}