Verstehe Bufferreader prinzip nicht

Taramsis

Bekanntes Mitglied
Hi Leute,

bin nicht der Erfahrenste im Thema Java! Ich versuch grad aus Java Matlab zu starten und hab folgendes gefunden:

Java:
package MatlabRuntimeInterface;
		
import java.lang.Runtime;
import java.io.*;


public class Engine {
	
	/**
	 * The constructor initializes the buffer storing Matlab's output.
	 */
	public Engine() {
		// Initialize the ouput buffer (stores Matlab's output).
		outputBuffer = new char[DEFAULT_BUFFERSIZE];
	}

	// indicates wether a Matlab session is currently open or closed
	private boolean isOpen = false;

	// a handle to the Matlab process
	private Process p;

	// the output stream of the Matlab process is piped to the stream 'in'
	private BufferedReader in;

	// the input stream of the Matlab process is piped to the stream 'out'
	private BufferedWriter out;

	// the error stream is piped to the stream 'err'
	private BufferedReader err;

	// Buffer size for receiving Matlab output. If buffer is full, remaining
	// data is retrieved and discarded.
	static final int DEFAULT_BUFFERSIZE = 65536;
        private char[] outputBuffer;

	// Once the output buffer is full, the remaining data is discarded into
	// a buffer, reading DEFAULT_SKIP characters at a time.
	private static final int DEFAULT_SKIP = 65536;

	// Stores the actual number of bytes read after last command.
	private int totalCharsRead;


	/**
	 * Starts a Matlab session on the current host using the command 'matlab'.
	 * @throws IOException Thrown if invoking Matlab was not successful.
	 */
	public void open() throws IOException {
		open("matlab");
	}

	/**
	 * Starts a process using the string passed as an argument.
	 * The operating system executes the string passed in as argument  
	 * <it>litteraly</it>.<br>
	 * Examples for starting Matlab (Unix-based systems):<br>
	 * <ul>
	 * <li> <code>startcmd = "matlab -nojvm -nosplash"</code> starts Matlab 
	 * on the current host without splash screen and whithout Java support.
	 * <li> <code>startcmd = "rsh hostname \"/bin/csh -c 
	 * 'setenv DISPLAY hostname:0; matlab'\""</code> starts Matlab on the host 
	 * "hostname" (under Linux).
	 * <li> <code>startcmd = "ssh hostname /bin/csh -c 
	 * 'setenv DISPLAY hostname:0; matlab'"</code> starts Matlab through a 
	 * secure shell (under Linux).
	 * </ul>
	 * @param startcmd The start command string.
	 * @throws IOException Thrown if starting the process was not successful.
	 */
	public void open(String startcmd) throws IOException {
		if (isOpen) {
			System.err.println("Matlab session already open.");
			return;
		}
		try {
			// System.err.println("Opening Matlab...");
			synchronized(this) {
				p = Runtime.getRuntime().exec("matlab");
				// get handle on the input/output strings
				out = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
				in  = new BufferedReader(new InputStreamReader(p.getInputStream()));
				err = new BufferedReader(new InputStreamReader(p.getErrorStream()));
				isOpen = true;

                                System.out.println("Open try");
			}
			// Wait for the Matlab process to respond.
			receive();
		}
		catch(IOException e) {
      System.err.println("Matlab could not be opened.");
			throw(e);
		}
	}

	/**
	 * Shuts down the Matlab session. After the "exit" command is written to
	 * the output stream to close Matlab, the method waits for the Matlab
	 * process to terminate. Finally, the input and the output streams are 
	 * closed.
	 * @throws InterruptedException Thrown if interrupt occured while waiting
	 *                              for the Matlab process to terminate. 
	 * @throws IOException Thrown if I/O streams could not be closed.
	 */
	public void close() throws InterruptedException, IOException {
		// System.err.println("Closing the Matlab session...");
		send("exit");
		try {
			synchronized(this) {
				p.waitFor();
				out.close();
				in.close();
				isOpen = false;
                                System.out.println("close try_in");
			}
                        System.out.println("Open try_out");
		}
		catch(InterruptedException e) {
			throw(e);
		}
		catch(IOException e) {
			System.err.println("Error while closing input/output streams.");
			throw(e);
		}
	}

	/**
	 * Send data to the Matlab process.
	 */
	private void send(String str) throws IOException {
 		try {
			// System.err.println("Evaluation string: "+str);
			// Adding the end of line character sequence will cause the Matlab
			// process to execute the command string.
			str+="\n";
			synchronized(this) {
				// write string to Matlab's input stream
				out.write(str, 0, str.length());
				out.flush();

			}
                        System.out.println("Send try");
		}
		catch(IOException e) {
			System.err.println("IOException occured while sending data to the"
												 +" Matlab process.");
			throw(e);
		}
	}

	/**
	 * Skip over data from the Matlab output.
	 * Instead of directly using the skip method of the BufferedReader,
	 * it was necessary to use read instead, since skip did work properly
	 * with our Java version (J2RE SE, 1.4.1) and operating system (Linux).
	 * The skip method of BufferedReader used to block instead of returning
	 * the actual number of characters skipped.
	 */
	private void skip() throws IOException {
		char[] skipBuffer = new char[DEFAULT_SKIP];
		while(in.ready()) {
			in.read(skipBuffer,0,DEFAULT_SKIP);
		}

                System.out.println("Skip");

		System.err.println("Warning: Some output information was "+
                                   "dropped, since the available number of "+
                                   "bytes exceeded the output buffer "+
                                   "size.");
	}
	
	/**
	 * Receive data from the Matlab process.
	 */
	private void receive()  {

		int charsRead = 0;
		int numberToRead;
		
		totalCharsRead = 0;
		// System.err.println("Receiving...");
 		try {
                        System.out.println("receive try_start");
			synchronized(this) {
				while (totalCharsRead == 0) {
                                    System.out.println("while_1");
					while (in.ready()) {
                                            System.out.println("while_2");
						if ((numberToRead = DEFAULT_BUFFERSIZE-totalCharsRead) > 0) {
                                                    System.out.println("if_1");
							charsRead = in.read(outputBuffer, totalCharsRead, numberToRead);
							if (charsRead > 0) {
                                                            System.out.println("if_2");
								totalCharsRead += charsRead;
							}
						}
						else {
							skip();
							return;
						}
					}
				}
			}
                        System.out.println("receive try_end");
		}
		catch(IOException e) {
			System.err.println("IOException occured while receiving data from"
					  +" the Matlab process.");
//			throw(e);
		}
	}

	/**
	 * Evaluates the expression contained in <code>str</code> using
	 * the current Matlab session, previously started by <code>open</code>.
	 * Note: The method blocks until the result stream is received from
	 * Matlab. The result is written to a private buffer, and may be
	 * retrieved with <code>getOutputString</code>.
	 * @param str Expression to be evaluated.
	 * @throws IOException Thrown if data could not be sent to Matlab. This
	 *                     may happen if Matlab is no longer running.
	 * @see #open
	 * @see #getOutputString
	 */
	public void evalString(String str) throws IOException {
                System.out.println("Sending...");
		send(str);
		receive();
	}

	/**
	 * Reads a maximum of <code>numberOfChars</code> characters from the 
	 * buffer containg Matlab's output.
	 * @return string containing the Matlab output.
	 * @see #open
	 */
	public String getOutputString (int numberOfChars) {
                System.out.println("OUTPUT");
		if (totalCharsRead < numberOfChars) numberOfChars = totalCharsRead;

		char[] result = new char[numberOfChars];
		System.arraycopy(outputBuffer, 0, result, 0, numberOfChars);
		return new String(result);
	}
}

Ich verstehe die Methode "receive()" nicht ganz. Besonders verstehe ich die Zeile
Java:
while (in.ready()) {
nicht. Auf was wartet er! Er kommt aus ieser Schleie nicht raus!;(
Würde mich über jede Anregung freuen!
 

nrg

Top Contributor
"True if the next read() is guaranteed not to block for input, false otherwise. Note that returning false does not guarantee that the next read will block."

was jetzt genau unter geblockt zu verstehen ist weiß ich auch net genau :). while (x.ready()) wird solange ausgeführt, bis der puffer leer ist. ich vermute mal, die schleife ist äquivalent zu:

Sting line;
for ( ( line = x.readLine() ) != null ) {

aber das ist nur eine Vermutung, die auch gut widerlegt werden kann (theoretisch - funktionell glaube ich schon, dass es das Gleiche ist). Ich selbst benutze die ready() methode nie. Habe sie letztens hier in einem CodeSchnipsel auch zum ersten Mal gesehn.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Verstehe Rekursion nicht ganz Java Basics - Anfänger-Themen 7
nbergmann x /= n : Verstehe ich nicht. Java Basics - Anfänger-Themen 24
S Schulaufgabe - verstehe leider die Aufgabe nicht Java Basics - Anfänger-Themen 4
ZH1896ZH Verstehe verschieden Scanner und hasNext() nicht ganz Java Basics - Anfänger-Themen 2
ZH1896ZH OOP Verstehe nicht was der Hinweis bedeutet, bitte um Hilfe! Java Basics - Anfänger-Themen 2
A Hilfe bei Rekursion,Ich verstehe nicht,wie funktioniert die Rekursion in der Methode "walk" Java Basics - Anfänger-Themen 13
A Shopping Cart Programm. Verstehe einige Zusammenhänge nicht Java Basics - Anfänger-Themen 1
T Brauche Hilfe um ein Programm zu verstehe Java Basics - Anfänger-Themen 4
K Erste Schritte Ich verstehe das Summenprogramm nicht Java Basics - Anfänger-Themen 10
S Ich verstehe die RegEx Tabelle von Javadoc nicht so ganz Java Basics - Anfänger-Themen 3
V Erste Schritte Array.length[x] in einer Schleife - ich verstehe das nicht Java Basics - Anfänger-Themen 1
Y Erste Schritte Ich verstehe this. nicht so richtig Java Basics - Anfänger-Themen 5
DaCrazyJavaExpert Methoden Verstehe Feheler nicht! Java Basics - Anfänger-Themen 7
Henri ich verstehe gerade nicht die Methode Java Basics - Anfänger-Themen 6
dave253 Ich verstehe folgenden Code nicht.. Java Basics - Anfänger-Themen 12
V Verstehe die Lösung einer Aufgabe von Grunkurs-Java nicht. Java Basics - Anfänger-Themen 11
J Verstehe die NullPointerException nicht Java Basics - Anfänger-Themen 1
J Verstehe meine HashSet Ausgabe nicht Java Basics - Anfänger-Themen 5
P Verstehe Lösung einer Aufgabe von "Grundkurs-Java" nicht Java Basics - Anfänger-Themen 5
O Ich verstehe nicht, was Eclipse von mir will Java Basics - Anfänger-Themen 10
G Methoden Verstehe nicht was in der Methode gemacht wird? Java Basics - Anfänger-Themen 5
M Verstehe das Programm(Quellcode) nicht!! Java Basics - Anfänger-Themen 12
B Verstehe ZufallInt = (int) (Math.random() * 5 + 1); nicht Java Basics - Anfänger-Themen 9
J Rekursiver Horner-Schema-Algorithmus - Verstehe ich ihn richtig? Java Basics - Anfänger-Themen 2
F verstehe diese Variable nicht... Java Basics - Anfänger-Themen 4
A Codezeile die ich nicht verstehe Java Basics - Anfänger-Themen 7
Pentalon Ein Aufruf den ich nicht verstehe Java Basics - Anfänger-Themen 11
V Verstehe die Logik nicht ... Java Basics - Anfänger-Themen 30
C rekursive Methode verstehe nicht! Java Basics - Anfänger-Themen 3
B verstehe methode nicht methode Java Basics - Anfänger-Themen 2
B Erste Schritte Verstehe das nicht Java Basics - Anfänger-Themen 3
C verstehe get und set nicht Java Basics - Anfänger-Themen 3
J Interface Wie funktioniert das mit den Interfaces. Ich verstehe es einfach nicht! :( Java Basics - Anfänger-Themen 15
T ich verstehe array nicht! Java Basics - Anfänger-Themen 11
P for Schleife mit break, verstehe die Ausgabe nicht Java Basics - Anfänger-Themen 6
A Verstehe readLine()-Funktion nicht Java Basics - Anfänger-Themen 3
A Verstehe das GUI nicht! Java Basics - Anfänger-Themen 7
D Verstehe Zusammenhang nicht- Und ihr? Java Basics - Anfänger-Themen 4
M THREADS - Ich verstehe es nicht Java Basics - Anfänger-Themen 10
E I-JVM verstehe ich das richtig (bytecode aufgabe) Java Basics - Anfänger-Themen 2
M Verstehe Aufgabe nicht, wie kann man schleifen einbauen? Java Basics - Anfänger-Themen 5
N Verstehe Step10 bei jME Eclipsetutorial nicht Java Basics - Anfänger-Themen 4
L Verstehe den Wert nicht! If-Anweisung Java Basics - Anfänger-Themen 5
N Verstehe diese Aufgabe nicht! Java Basics - Anfänger-Themen 16
Rudolf Verstehe das Ergebnis nicht - bitte erklären Java Basics - Anfänger-Themen 7
S Finde den Fehler nicht/ verstehe Anweisung nicht Java Basics - Anfänger-Themen 12
K Ich verstehe switch einfach nicht Java Basics - Anfänger-Themen 4
C Verstehe Code-Teil nicht. Java Basics - Anfänger-Themen 2
S Ich verstehe diese Methode nicht! Java Basics - Anfänger-Themen 6
G Verstehe das nicht. bitte um hilfe Java Basics - Anfänger-Themen 13
R Thread startet nicht, verstehe nicht warum Java Basics - Anfänger-Themen 2
R Verstehe die Ausgabe von folgendem Code nicht Java Basics - Anfänger-Themen 4
A verstehe aufgabenstellung nicht! Java Basics - Anfänger-Themen 47
S verstehe den fehler nicht Java Basics - Anfänger-Themen 14
C Verstehe die Syntax nicht! Java Basics - Anfänger-Themen 2
M Verstehe den Quellcode nicht ganz Java Basics - Anfänger-Themen 3
7 Verstehe Programm nicht Java Basics - Anfänger-Themen 6
G verstehe das problem nicht :( Java Basics - Anfänger-Themen 4
S RegEx Syntax - ich verstehe sie einfach nicht! Java Basics - Anfänger-Themen 3
G verstehe den unterschied zwischen equals und == nicht Java Basics - Anfänger-Themen 3
E Verstehe eine Schleife nicht Java Basics - Anfänger-Themen 5
B Eine Linie zeichnenmit Java, ich verstehe das einfach nicht Java Basics - Anfänger-Themen 4
G Verstehe einen Aufruf absolut nicht Java Basics - Anfänger-Themen 2
T BufferReader soll datei mehrmals lesen Java Basics - Anfänger-Themen 13
L Textfile mit BufferReader einlesen Java Basics - Anfänger-Themen 4
S BufferReader IOException Java Basics - Anfänger-Themen 3
G Fehler bei Array und BufferReader Java Basics - Anfänger-Themen 7
G BufferReader --> BufferWriter Java Basics - Anfänger-Themen 19
B Liskov Prinzip Java Basics - Anfänger-Themen 3
L OOP Interface Prinzip? Java Basics - Anfänger-Themen 6
I iCal und auf Homepage einbinden - Prinzip Java Basics - Anfänger-Themen 2
S DRY Prinzip - Hilfe! Java Basics - Anfänger-Themen 5
H Vererbung Prinzip der Ersetzbarkeit-Sinn? Java Basics - Anfänger-Themen 9
B Bei Swing weg vom North-West-South-East-Prinzip Java Basics - Anfänger-Themen 2
S MVC Prinzip - update() ? Java Basics - Anfänger-Themen 2
C OOP Model View Controller - Prinzip Java Basics - Anfänger-Themen 6
K Frage zum Model View Controller Prinzip Java Basics - Anfänger-Themen 6
M Prinzip der Kapselung - Wie Aufruf der Methode? Java Basics - Anfänger-Themen 2
E Frage zum MVC-Prinzip Java Basics - Anfänger-Themen 2
L Callback-Prinzip Java Basics - Anfänger-Themen 8
M Frage zum MVC Prinzip Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben