Inputstream "verfügbar"

Status
Nicht offen für weitere Antworten.
P

paul65

Gast
Hi

Ich lese von einem Socket den Inputstream, und lesen diesen dann Byte für Byte mithilfe der read() Methode aus.
Solange kein \n (New Line) Zeichen daherkommt, wird weitergelesen.

Code:
while ( (z = in.read()) != '\n' ) {
		  if (z != -1)
			  b.write(z); (b ist ein ByteArrayOutputStream)
		  else {
			  try {
				  Thread.sleep(1000);
			  } catch (InterruptedException e) {
				  e.printStackTrace();
			  }
		  }
			  
	  }

In der Bedingung der while-Schleife darf ich nicht auf z != -1 prüfen, da die Situation vorkommen kann, dass der InputStream verzögert abgefüllt wird.

Gibt es also eine Möglichkeit zu prüfen, ob der InputStream "verfügbar" ist?
Denn solange würde ich einfach lesen (oder eben bis ein \n daherkommt).

Für Tipps bin ich sehr dankbar, komme nicht mehr weiter.
 

musiKk

Top Contributor
Ich verstehe "verzoegert abgefuellt" nicht. Die read()-Methode blockiert beim Lesen so lange, bis ein Zeichen kommt. Wenn sie -1 liefert, dann ist der Stream geschlossen und du kannst nichts mehr davon lesen.
 
P

paul65

Gast
Dann heisst -1 also, dass der Stream zu Ende ist und auch keine weiteren Daten folgen können???

Die read() Methode blockiert ja solange bis Daten daher kommen, oder eben der Stream zu Ende ist (-1).
Wie kann ich diese Situation in einem JUnit Test abbilden, dass eben keine Daten daherkommen, sodass read() einen Moment blockt? Ein leerer String im InputStream erzeugt ja direkt eine -1.
 

musiKk

Top Contributor
Naja, du darfst den Stream vorher nicht schliessen. Ich weiss ja nun nicht, welchen InputStream du verwendest und woher du die Daten beziehst. Hab mal kurz was zusammenkritzelt:
Code:
package test;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

public class Testmain2 {

	public static void main(String[] args) throws Exception {

		PipedInputStream pis = new PipedInputStream();
		PipedOutputStream pos = new PipedOutputStream(pis);

		Thread w = new Writer(pos);
		Thread r = new Reader(pis);

		r.start();
		w.start();

	}

}

class Reader extends Thread {

	InputStream in;

	public Reader(InputStream in) {
		this.in = in;
	}

	@Override
	public void run() {
		int counter = 0;
		int c = 1;
		try {
			while ((c = in.read()) != -1) {
				System.out.println(counter++ + " " + c + " ");
			}
			System.out.println("ende");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

class Writer extends Thread {

	OutputStream out;

	public Writer(OutputStream out) {
		this.out = out;
	}

	@Override
	public void run() {
		try {
			for (int i = 0; i < 10; i++) {
				out.write('x');
				out.flush();
				Thread.sleep(1000);
			}
			out.close();

		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}
Das blockiert halt immer eine Sekunde lang. In der Zeit "haengt" die read()-Methode.
 

lhein

Top Contributor
Das Problem ist halt immer wieder, dass Leute einfach Objekte und Methoden verwenden, ohne auch nur annähernd vollständig zu verstehen, was sie eigentlich tun. Ein Blick in die Java-API Dokumentation wäre hier wirklich dringend angebracht.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Socket Wie kann man in Java die Anzahl der Objekte in einem InputStream sehen ohne ihn durchgehen zu müssen Netzwerkprogrammierung 1
S Socket String InputStream in hex umwandeln Netzwerkprogrammierung 1
D GZIP InputStream lesen ohne zu encoden Netzwerkprogrammierung 1
F Java Server Scanner oder InputStream kann nicht gelsesen werden! Netzwerkprogrammierung 6
R Socket InputStream readObject > Connection Reset Netzwerkprogrammierung 3
windl InputStream cachen Netzwerkprogrammierung 3
K Socket InputStream wird nicht erzeugt Netzwerkprogrammierung 4
M Socket InputStream liest nicht vollständig Netzwerkprogrammierung 7
M Was macht Thread, wenn er aus einem "leeren" Inputstream liest ? Netzwerkprogrammierung 5
K Byte für Byte aus InputStream lesen Netzwerkprogrammierung 5
F JSch - inputstream is closed Netzwerkprogrammierung 13
M Socket InputStream sendet ausgaben von OutputStream zurück Netzwerkprogrammierung 2
D Inputstream to Outputstream Netzwerkprogrammierung 3
M InputStream and ObjectInputStream zur gleichen Zeit Netzwerkprogrammierung 11
T Inputstream -> verschiedene Objekte lesen Netzwerkprogrammierung 3
MQue Inputstream Timeout Netzwerkprogrammierung 2
S Servlet InputStream leer?! Netzwerkprogrammierung 14
G HTTP-Request InputStream-Problem Netzwerkprogrammierung 5
G JPG im InputStream Netzwerkprogrammierung 2
A InputStream liest immer komplettes PHP-Script Netzwerkprogrammierung 6
A InputStream ließt nur 65536 Zeichen anstatt ganzer Puffer Netzwerkprogrammierung 8
A inputstream teilen? Netzwerkprogrammierung 4
D InputStream (Socket) mit BufferedInputStream puffern Netzwerkprogrammierung 2
M Sockets und InputStream Netzwerkprogrammierung 8
R Client nimmt den Inputstream nicht an Netzwerkprogrammierung 5
S Mail anhang in InputStream packen Netzwerkprogrammierung 5
M InputStream - Bytes gehen verloren? Netzwerkprogrammierung 3
E Problem bei Sockets/InputStream über externe Klasse Netzwerkprogrammierung 5
André B. In einen InputStream schreiben? Netzwerkprogrammierung 6
G inputstream hat plötzlich weniger inhalt Netzwerkprogrammierung 8
Z ProgressBar auf BufferedOutput- & -InputStream Netzwerkprogrammierung 2

Ähnliche Java Themen


Oben