# JAVA hängt bei Dateikopie über LAN ein Byte an!!! ARGH



## opp (15. Nov 2003)

Hallo leute,

ich schreibe gerade 2 kleine programme, die auch schon wirklich super funktionieren, bis auf eine kleine sache.

Eins der Programme (Der Sender) Schickt einen BufferedInputStream(FileInputstream(QUELLDATEI)) mit namen "input" Byte für byte in einen Socket.getOutputStream() mit namen "output, mit folgendem algorithmus:

```
int temp = 0;               
            while (temp != -1){         
                temp = input.read();
                counter++;
                output.write(temp);
            }
            output.flush();
```

Das zweite Programm (Der Empfänger) schickt einen BufferedInputStream(ServerSocket.accept().getInputStream) mit namen "input" byte für Byte in einen BufferedOutputStream(FileOutputStream(FILENAME)), mit folgendem Algorhitmus:

```
int temp = input.read();
            while (temp != -1){
                counter++;
                output.write(temp);
                temp = input.read();
            }
            output.flush();
```

WEITERE INFOS:
 - Wie man sieht werden übrigens die jeweiligen outputs ordentlich geflusht.
 - Die Countervariable zählt beim Empfänger übrigens auch ein Byte zu viel, ich habe bis jetzt nicht herausfinden können woher das gesamte Problem kommt.
 - Wie man sieht habe ich beim Empfänger den Wert "-1" als kriterium gesetzt, die schleife zu beenden, und diesen Wert vom Schreiben ausgesperrt - habe ich deswegen gemacht weil beim DateileseStream des Senders "-1" der Code für das Ende des Files ist, und das muss man ja nicht in die neue Datei mitschreiben.
 - ÜBRIGENS (vielleicht interessant): Das angehängte Byte hat IMMER den Wert "255", bzw in HEX "FF".

Also, woran liegt das? Ich bin mir sicher irgendeinen dummen Fehler gemacht zu haben auf den ich selbst nur blind geworden bin.

Vielen Dank im Voraus und Viele Grüße,
David


----------



## Ebenius (18. Nov 2003)

Du fragst in Deiner kopfgesteuerten Schleife eine Variable ab, ob sie _-1_ ist.


> while (temp != -1){


danach liest Du diese Variable erst ein!


> temp = input.read();



Spielen wir den Fall durch und überlegen, was passiert, wenn Du eine _0_ bytes große Datei einliest:


```
int temp = 0; /* temp wird auf 0 gesetzt */

	/* erster Durchlauf */
	while (temp != -1) /* temp ist 0, Bedingung wahr */
	{
		temp = input.read(); /* list -1 ein, da File am Ende, da leer!!!*/
		counter++; /* egal */
		output.write(temp); /* schreibt -1 in den socket stream */
	}

	/* erster Durchlauf */
	while (temp != -1) /* temp ist -1, Bedingung falsch! */

	output.flush(); /* flushes */
```

Damit schickst du in jedem falle _-1_ als letztes byte in den outputstream, was beim schreiben in das file auf der gegenseit im übrigen zu [unsigned8bit]-1 = 255 führt. Kappiert? Sonst nochmal posten!

Ebenius


----------



## Ebenius (18. Nov 2003)

Sorry, der java PSEUDO-CODE von mir eben heißt richtig:


```
int temp = 0; /* temp wird auf 0 gesetzt */ 

   /* erster Durchlauf */ 
   while (temp != -1) /* temp ist 0, Bedingung wahr */ 
   { 
      temp = input.read(); /* list -1 ein, da File am Ende, da leer!!!*/ 
      counter++; /* egal */ 
      output.write(temp); /* schreibt -1 in den socket stream */ 
   } 

   /* ZWEITER Durchlauf */ 
   while (temp != -1) /* temp ist -1, Bedingung falsch! */ 

   output.flush(); /* flushes */
```

mfg, Ebenius


----------



## Ebenius (18. Nov 2003)

Ach ja: hatte noch folgendes vergessen.

*Für solche Sachen bietet sich java.io.PipedInputStream in Verbindung mit java.io.PipedOutputStream an, um nicht einzelne bytes in for schleifen zu verschieben und sich auf 
-1 als EOF zu berufen... Wir programmieren ja kein C *


----------

