Ich arbeite an einem Windows 7-Rechner.Verwenden der Eingabeaufforderung mit Java
Ich arbeite an einer Anwendung, die eine Front für den GHCi-Interpreter für Haskell ist. Der Benutzer gibt einen Befehl ein, dann führt Java den Befehl über die exec() -Methode in Runtime aus, und dann zeigt die Anwendung den Text an, der angezeigt würde, wenn der Benutzer GHCi nur mit der Eingabeaufforderung ausführen würde.
Im Moment habe ich Probleme mit der Schleife, die die Ausgabe druckt.
Hier ist der Code, den ich gerade habe.
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();
}
}
}
Ich weiß, dass die anfängliche Start von GHCi arbeitet, weil das Programm den Ausdruck „GHCi, Version 7.10.3: http://www.haskell.org/ghc/: Hilfe“. Das Problem scheint jedoch die while-Schleife (sc.hasNextLine()) zu sein, die die Ausgabe der Eingabeaufforderung lesen und ausgeben soll, bis nichts mehr übrig ist, da sie nicht aus der Schleife ausbrechen und mit fortfahren wird lese die Benutzereingabe. Ich weiß das, weil das Programm nicht das "Yay" -Flag druckt, das ich nach der Schleife eingegeben habe.
Haben Sie versucht, einen gepufferten Leser anstelle von Scanner zu verwenden? – Norsk
Weil 'sc.hasNextLine()' wartet, bis das ** Ende des Streams ** erreicht wurde (wenn keine Eingabe erfolgt) ... Und das Ende des Streams wird nur passieren, wenn das Programm beendet wird. – Codebender
Zwei Bedenken: 1. GHCi ist nicht wirklich so konzipiert, um so verwendet zu werden. Es ist ein interaktives Entwicklungswerkzeug. Wenn Sie sich auf Details ihrer interaktiven Benutzeroberfläche verlassen, kann Ihr Programm zum Erliegen kommen, wenn eine neue Version herauskommt. Könnten Sie einfach 'ghc -e' für Ihre Zwecke verwenden? 2. Sie sollten GHCi nicht dem Web aussetzen, es sei denn, Sie haben eine große Sandbox um es herum; voller GHCi-Zugriff ist wie voller Shell-Zugriff. – dfeuer