【发布时间】:2016-04-18 04:12:43
【问题描述】:
我正在使用 Windows 7 机器。
我正在开发一个应用程序,它是 Haskell 的 GHCi 解释器的前端。用户输入一个命令,Java 将通过 Runtime 上的 exec() 方法执行该命令,然后应用程序将显示用户使用命令提示符运行 GHCi 时会显示的文本。
现在,我遇到了打印输出的循环问题。
这是我现在拥有的代码。
public class GHCiTest {
public static Scanner rd, sc;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {
System.out.println("Starting... ");
Process p = Runtime.getRuntime().exec("ghci");
PrintStream hugsin = new PrintStream(p.getOutputStream());
InputStream hugsout = p.getInputStream();
sc = new Scanner(hugsout);
rd = new Scanner(System.in);
String rdnextline;
while (true){
while (sc.hasNextLine()){
System.out.println(sc.nextLine());
}
System.out.println("yay");
rdnextline = rd.nextLine();
if (rdnextline == "quit"){break;}
hugsin.println(rdnextline);
hugsin.flush();
}
System.out.println(" ... successful completion.");
}
catch(IOException e) {
e.printStackTrace();
}
}
}
我知道 GHCi 的初始启动是有效的,因为程序正在打印“GHCi,版本 7.10.3:http://www.haskell.org/ghc/:? for help”。但是,问题似乎是 while(sc.hasNextLine()) 循环,它应该读取命令提示符的输出并将其输出,直到没有任何剩余,因为它不会跳出循环并继续读取用户输入。我知道这一点是因为程序没有打印我在循环后放入的“yay”标志。
【问题讨论】:
-
您是否尝试过使用缓冲阅读器而不是扫描仪?
-
因为
sc.hasNextLine()一直等到到达流结束(如果没有输入)...并且流结束只会在程序退出时发生。 -
两个问题: 1. GHCi 并不是真正设计成这样使用的。它是一个交互式开发工具。依赖其交互式用户界面的任何细节都可能使您的程序在新版本出现时中断。你可以使用
ghc -e来达到你的目的吗? 2. 你最好不要将 GHCi 暴露在网络上,除非你周围有一些主要的沙箱;完整的 GHCi 访问权限就像完整的 shell 访问权限。