Inputstream -> verschiedene Objekte lesen

  • Themenstarter Themenstarter Tarek1337
  • Beginndatum Beginndatum
T

Tarek1337

Gast
Hi,
ich habe einen Inputstream von einem HTTP request und möchte nun die Header als String lesen und die eigentlichen Daten in ein byte Array ablegen.

Mein Ansatz sieht wie folgt aus (der Inputstream kommt von einem Socket):

Java:
		InputStream stream = remoteSocket.getInputStream();
		BufferedReader in = new BufferedReader(new InputStreamReader(stream));
		
		List<String> requestLines = new ArrayList<String>();
		ByteArrayOutputStream message = new ByteArrayOutputStream();
		
		String line;
		while ((line = in.readLine()) != null && !line.equals(""))
			requestLines.add(line);
		
		byte[] data = new byte[1024];
		while (true) {
			int	len = stream.read(data);
			if ( len > 0 )
				message.write(data, 0, len);
			else if ( len == 0 )
				try {
					Thread.sleep(20);
				} catch (Exception e) {
				}
			else
				break;
		}

Das Ergebnis sieht allerdings immer so aus, dass ich nach den Headern nichts mehr bekomme d.h. stream.read(data) liefert gleich beim ersten aufruf -1.
Was mache ich falsch? Liegt es evtl. daran, dass ich zuerst über einen BufferedReader lese, und danach auf den normalen InputStream zugreife?


mfg
 
Liegt es evtl. daran, dass ich zuerst über einen BufferedReader lese, und danach auf den normalen InputStream zugreife?
Ja. Du liest in der ersten Schleife den kompletten Datenstrom bis zum Ende, dadurch
liefert ein anschliessendes stream.read() -1. Es gibt ja schliesslich nichts mehr zum Lesen.

Warum nicht einfach alles direkt vom InputStream auslesen?
 
Hi,
der Stream kann eigentlich nicht zu ende sein, da ich in der Schleife nur die Header lese. Ein weiteres in.readLine() nach der ersten Schleife bringt mir dann auch den rest, den ich halt als byte Array brauche (ohne irgendwelche codierungen etc.).

Alles über den InputStream zu lesen ist eigentlich das, was ich zuletzt probieren werde. Hatte halt gehofft, dass es eine einfachere Möglichkeit gibt, als die Header byte-weise zu lesen und nach einem line feed abzufragen.

Z.b. würde der ObjectInputStream read(byte[]....) und readLine() anbieten. Somit könnte ich mit einem Stream beides lesen, allerdings ist readLine() hier deprecated...
 
Hi,
der Stream kann eigentlich nicht zu ende sein, da ich in der Schleife nur die Header lese. Ein weiteres in.readLine() nach der ersten Schleife bringt mir dann auch den rest, den ich halt als byte Array brauche (ohne irgendwelche codierungen etc.).

Doch, denn du nutzt ja einen _BUFFERED_Reader. Der liest "voraus", und speichert zwischen. Wenn du dann direkt auf den Stream zugreifst ist dieser - je nach Länge - leer, aber wenn du den Reader verwendest liest du dessen Puffer aus und erhälst weiterhin Daten.
 

Zurück
Oben