# Files versenden



## Kerberus (19. Apr 2004)

Bis jetzt habe ich das Problem so gelöst, dass ich die Bytes eines Files eingelesen habe, diese in ein String geschrieben habe und den String dann durch einen Socket an einen Server geschickt habe. Der Server hat dann den String wieder in ein File geschrieben. Leider funktioniert diese Methode nur bei kleinen Datenmengen (bis zu 4kB) 
Bei ca. 28kB wartet man schon ca. 5 Minuten.
Gibt es keine Möglichkeit ein File direkt zu verschicken?

Ich danke schon einmal für die Hilfe.
Sir MacKerberus


----------



## Illuvatar (19. Apr 2004)

Um die Wartezeit wirst du nicht herumkommen, da du ja so oder so den gesamten Inhalt des Files verschicken musst.
Aber das Zwischenspeichern in einem String ist nicht nötig:

```
FileInputStream is = new FileInputStream (file);
OutputStream os = socket.getOutputStream();
int i;
byte[] b = new byte[1024];
while ((i = is.read (b)) > 0){
  os.write (b);
}
```
Und auf dem PC, wo die Daten ankommen, eben andersherum.
Das ist, denke ich, die beste Lösung.


----------



## Kerberus (21. Apr 2004)

Das Problem mit dieser Methode ist einfach, dass sie viel zu lange geht. Wenn man Files verschicken will die ein paar MB gross sind, wartet man bis ans Ende seiner Tage.


----------



## Freddy (21. Apr 2004)

Hier ein Stück Code aus meinem Chatserver:


```
String file = "filename.ext";
BufferedInputStream br = new BufferedInputStream(new FileInputStream(file), 32768);
BufferedOutputStream bos = new BufferedOutputStream(sock.getOutputStream(), 32768);
int data;
while ((data = br.read()) != -1)
    bos.write(data);
bos.close();
br.close();
```

Das Verwenden von Puffern bei IO in Java beschleunigt Lese- und Schreibvorgänge erheblich.[/code]


----------



## Kerberus (23. Apr 2004)

Danke für eure Antworten.
Ich habe jetzt folgenden Code geschrieben.

Senden:

```
Socket server = new Socket(args[1], Integer.parseInt(args[2]));
PrintWriter out = new PrintWriter(server.getOutputStream());

BufferedInputStream file = new BufferedInputStream(new FileInputStream(args[0]));

while(true)
{
 out.print(file.read());

 if(file.read() == -1)
 {
   break;
 }
}

out.flush();
```

Empfangen:

```
BufferedReader in = new BufferedReader(new InputStreamReader(intern_client.getInputStream()));
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("test.jpg"));

while(true) 
{
 int b = in.read();

 if(b == -1)
 {
   break;
  }
  out.write(b);
}

out.close();
```

Leider kann ich die jpg-Datei die dadurch erstellt werden soll nicht öffnen. Es muss also irgend wo noch einen Fehler in meinem Code haben.


----------



## Kerberus (23. Apr 2004)

Habe den Fehler gefunden.
Es ergibt sich jedoch schon ein nächstes Problem. Ich arbeite jetzt mit BufferedOutputStreams. 
Wie kann ich einen  String verschicken? Geht das überhaupt? Denn soweit ich weiss, kann man aus dem Stream nur Bytes lesen, oder?


----------

