# Inputstream "verfügbar"



## paul65 (18. Aug 2008)

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.


```
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 (18. Aug 2008)

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.


----------



## paul65 (18. Aug 2008)

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 (18. Aug 2008)

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:

```
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 (18. Aug 2008)

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.


----------

