gpt4 book ai didi

java - 进行Java编译时不获取输入

转载 作者:行者123 更新时间:2023-12-01 09:04:39 24 4
gpt4 key购买 nike

我正在做一个简单的java编译器。我的程序正在运行,但是如果要扫描,它不会接收输入并且会卡住。

来 self 的编译器的一小段代码

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);
}
}

我正在等待你的帮助。

<小时/>

已编辑

现在,当我运行 GUI 时,将按下“运行”键。你认为我应该做什么?

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 应用程序运行时,此运行按钮仍然存在。

最佳答案

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

  • 您要编译的类名为 numberScan ,但显然存储在名为 Test.java 的文件中。公共(public)类只能存储在与该类同名的文件中。调用类(class)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();
}
}

关于java - 进行Java编译时不获取输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41382655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com