# Ende des Streams ohne Schließen/Checksumme mitsenden



## MJA (8. Nov 2005)

Hallo.

Ich habe eine eher simple Frage, ich hoffe zumindest, dass es dafür eine einfache Lösung gibt.
Ich schreibe über TCP in einen CheckedOutputStream, der auf der anderen Seite von einem CheckedInputStream ausgelesen wird. Ich übertrage auf diesem Weg beliebige Dateien. Beide Streams bilden während der Übertragung eine Adler32-Prüfsumme. Um feststellen zu können, ober alle Daten verlustfrei übertragen wurden möchte ich den Wert der Prüfsumme am Ende mitschicken.
Das Auslesen binärer Streams wird ja oft so gemacht:

```
int c;
while((c = stream.read()) != -1)
...;
```
Die Schleife bricht erst ab, wenn die read()-Methode -1 zurückgibt. Das tut sie aber nur, wenn der Stream geschlossen wird. Da ich aber verhindern möchte, dass die Prüfsumme mit in die Datei geschrieben wird muss ich dafür sorgen, dass ich sie vom eigentlichen Inhalt der Datei unterscheiden kann. Ich hatte erst daran gedacht:

```
FileInputStream fileInputStream = new FileInputStream(file);
CheckedOutputStream checkedOutputStream = new CheckedOutputStream(socket.getOutputStream(), adler32);
				
int input;
				
while((input = fileInputStream.read()) != -1)
checkedOutputStream.write(input);
				
PrintStream printStream = new PrintStream(socket.getOutputStream());
printStream.println(adler32.getValue());
			
socket.close();
fileInputStream.close();
```
Auf der Gegenseit wird so ausgelesen:

```
FileOutputStream fileOutputStream = new FileOutputStream(file);
CheckedInputStream checkedInputStream = new CheckedInputStream(socket.getInputStream(), adler32);
			
int input;
while((input = checkedInputStream.read()) != -1)
fileOutputStream.write(input);

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			
String checksumString = bufferedReader.readLine();
			
socket.close();
fileOutputStream.close();
```
Natürlich funktioniert das nicht, die Checksumme wird ans Dateiende geschrieben und checksumString ist null. Also habe ich überlegt, wie ich es schaffen kann, die while-Schleife an der entsprechenden Stelle zu unterbrechen. Wenn man -1 über die write()-Methode versendet kommt auf der anderen Seite ein ÿ herraus. D.h. so kann ich den Vorgang nicht abbrechen. Das geht nur, in dem ich den Stream schließe. Dann kann ich die Prüfsumme aber nicht versenden.
Weiß jemand, wie ich die while()-Schleife unterbrechen könnte? Muss ich vielleicht einen bestimmten anderen Wert senden? Weiß jemand eine andere Möglichkeit, die Prüfsumme mitzuschicken, ohne sie in die Datei zu schreiben?
Wichtig ist, dass ich damit pauschal jede Art von Datei versenden können soll.

Gruß,
Jan.


----------



## Bleiglanz (8. Nov 2005)

weisst du vorher, wieviele bytes du sendest?

wenn ja: schreib die länge -> schreib den inhalt -> schreib die checksum

dann weisst du beim lesen, wann die checksum kommt

wenn nicht: arbeitest du nur mit strings?


----------



## Nick H. (8. Nov 2005)

du kannst ja auch nen 2. Stream öffnen
über den wird dann die Checksumme übertragen


----------

