Process.getInputStream unter Linux

  • Themenstarter Themenstarter FlorianP
  • Beginndatum Beginndatum
F

FlorianP

Gast
Hallo,
ich muss aus einem Java Programm Scilab aufrufen und damit rechnen. Der folgende Code läuft unter Windows, nicht aber unter Linux.

Java:
private static final String COMMAND = "/usr/bin/scilab"; // Linux
private static final String OPT = "-nwni"; // Linux
// private static final String Command = "c:\\programme\\scilab-5.3.0\\bin\\Scilex.exe"; // Windows

ProcessBuilder pb = new ProcessBuilder(COMMAND,OPT); // Linux
// ProcessBuilder pb = new ProcessBuilder(COMMAND); // Windows
pb.redirectErrorStream(true);

Process sciProcess = pb.start();

new Thread() {
				public void run() {
					BufferedReader r = new BufferedReader(new InputStreamReader(sciProcess.getInputStream()));
					while (true) {
						try {
							String sciOutput = r.readLine();
							System.out.println(sciOutput);
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}
			}.start();

PrintStream sciExec = new PrintStream(sciProcess.getOutputStream());
sciExec.println("A=5");
sciExec.flush();

Unter Windows bekomme ich die Ausgaben von Scilab inklusive der copyright Meldungen am Anfang. Unter Linux bekomme ich nichts. Laut ps läuft der Prozess aber.
Ein ähnliches Problem bekomme ich mit bc, da bekomme ich ebenfalls die Copyrightmeldung nicht, kann dann aber damit rechnen und bekomme die Ergebnisse.

Hat jemand einen Vorschlag?

LG Florian
 
Gehts denn wenn du dne Stream schließt?Und ich würde die Endlosschleife da weglassen, benutze den Scanner und hasNext 🙂

Java:
		private static final String COMMAND = "/usr/bin/scilab"; // Linux
		private static final String OPT = "-nwni"; // Linux
		// private static final String Command =
		// "c:\\programme\\scilab-5.3.0\\bin\\Scilex.exe"; // Windows

		ProcessBuilder pb = new ProcessBuilder(COMMAND, OPT); // Linux
		// ProcessBuilder pb = new ProcessBuilder(COMMAND); // Windows
		pb.redirectErrorStream(true);

		final Process sciProcess = pb.start();

		new Thread() {
			public void run() {
				Scanner sc = new Scanner(sciProcess.getInputStream());
				while (sc.hasNext()) {
					System.out.println(sc.next());
				}
			}
		}.start();
		PrintStream sciExec = new PrintStream(sciProcess.getOutputStream());
		sciExec.println("A=5");
		sciExec.println("A*A");
		sciExec.close();

???:L
 
Danke schonmal für den Hinweis. Wenn ich close() verwende, bekomme ich das Ergebniss der einen Rechnung. Aber immer noch nicht die Startup Meldungen und ich muss mehrere (ziemlich viele) Berechnungen nacheinander ausführen. Und nach einem erneuten öffnen des Streams mit getOutputStream() kann ich keine zweite Berechnung durchführen.

Und das Starten von Scilab dauert zu lange, als dass ich für jede Berechnung Scilab neu starten könnte!
 
Vielleicht sollte ich noch anmerken, dass manche Programme damit (ohne close() ) funktionieren, bsp. ps oder cat gibt die gewünschte Ausgabe. bc kann gibt nach einer Eingabe auch das gewünschte Ergebnis aus, es fehlt aber die Startup Meldung!
 
Du könntest mal versuchen den Outputstream vor dem InputStream zu setzten, also das
PrintStream sciExec = new PrintStream(sciProcess.getOutputStream());

So was ähnliches hatte vor kurzem ein anderer hier im Forum, und der hatte auch ganz seltsame Probleme, die dadurch behoben wurden.
 
Hab das jetzt auch probiert, auch ein paar Varianten mit OutputStream davor, mit Scanner oder mit Endlosschleife, ich bekomm erst eine Ausgabe wenn ich close() mache, und dann alle gleichzeitig. Und die Copyright Meldung hab ich bisher noch nie bekommen.
Hab das ganze unter Ubuntu 10.04 und 11.04, jeweils mit sun-java oder open-jdk ausprobiert, kein Unterschied.

Fällt noch jemandem was ein woran das liegen kann?
 
Das haben wir als erstes versucht, aber die verträgt keine übermäßig langen Berechnungen und stürzt dann ab, das aber wenigstens Plattformunabhängig! 😉 Damit haben wir uns schon ziemlich lang beschäftigt und wollen es jetzt über Konsole versuchen.
 

Neue Themen


Zurück
Oben