在执行Java Compiler时不要输入

时间:2016-12-29 15:29:06

标签: java eclipse

我正在做一个简单的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应用程序运行时,此运行按钮仍然存在。

1 个答案:

答案 0 :(得分:1)

给定代码存在几个问题。我试图将其压缩成评论,但现在决定将其扩展为答案:

  • 要编译的类名为numberScan,但显然存储在名为Test.java的文件中。公共类只能存储在与该类同名的文件中。调用课程NumberScan,然后调用文件NumberScan.java

  • 您只是尝试打印输入流提供的输出。但您打印错误流提供的结果(因此如果有错误,您将看不到它们!)。此外,您只打印了Process process的输出(用于运行程序)。您没有打印用于编译程序的Process processC的输出。

  • 您没有看到任何输出的原因是该行

    System.out.println(outputHandler.getOutput());
    

    执行过程完成之前执行。您使用了waitFor,但output由不同的帖子填充 - 即IOThreadHandlergetOutput方法只能在 IOThreadHandler完成后调用,但如果您想要不断更新输出,那么这将无效。

您想要实现的目标尚不完全清楚,但从您提供的代码中猜测,您的目标似乎是创建一个程序

  • 编译给定的Java文件
  • 执行生成的Java程序
  • 打印可能的错误消息和程序创建的输出
  • 重要提示:允许与程序进行交互,因为应该可以将输入发送到程序的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();
    }
}