# Downloads korrupt



## Krondor (23. Okt 2004)

Hallöle,

ich hab da mal eine Frage.
Ich hab mir ein kleines Programm gebastelt, welches Datan von einem
Server herunterladen soll. Dabei handelt es sich um eine Zip-Datei.

Die Datei wird auch heruntergeladen aber ich kann sie dann nicht öffnen.
WinZip/WinRar sagen, dass die Datei korrupt ist.

Wenn ich die Datei jetzt mit meinem Browser herunterlade und beide Dateien
im Editor vergleiche, dann sehe ich dass in der Datei die ich mit meinem Programm
gedownloaded habe manche Zeichen nicht richtig drin stehen... stattdessen stehen
dort Fragezeichen.

Muss ich die Daten irgendwie anders einlesen oder schreiben???
Binär oder so?

Hier der Quellcode:

Achso und dankeschön im Voraus!


```
package general;

import java.net.*;
import java.io.*;

public class Client {
	URL url;
	File target;
	public Client(URL url){
		this.url = url;
		
		//Erstellt die passenden Ordner wo die Datei reingehört
		target = new File("d:\\downloader\\" + url.getPath());
		target.getParentFile().mkdirs();
	
		download();
	}
	
	public void download(){
		System.out.println("Beginne mit Download...");
		
		try{
			FileWriter fw = new FileWriter(target);
			
			HttpURLConnection huc;
			huc = (HttpURLConnection)url.openConnection();
			
			InputStream is = huc.getInputStream();
		
			int len;
			byte b;
			while ( (len = is.read()) != -1) {
				fw.write((char)len);
			}
			fw.flush();
			huc.disconnect();
			System.out.println("Fertig mit Download");
		}
		catch(IOException e){
			System.err.println("IOException");
			System.err.println(e.getMessage());
		}
	}
	
	public static void main(String[]args){
//		String urlPath = "http://team-peter.clanintern.de/filecopy/a.txt";
		String urlPath = "http://fileserver.simszone.de/sims2/files/clothes/clothes2191.zip";
		try{
			new Client(new URL(urlPath));
		}
		catch(MalformedURLException e){
			System.err.println("MalformedURLException");
		}
	}
}
```


----------



## Beni (23. Okt 2004)

Diese Umwandlung des Integers in einen Char kommt mir seltsam vor, versuchs mal ohne.

```
fw.write((char)len); // ???
```

Laut API soll man beim FileOutputStream "close()" aufrufen, wenn man ihn nicht mehr braucht (dann wird die Datei wirklich vervollständigt). Auch das könnte ein Unterschied machen.


----------



## Krondor (23. Okt 2004)

kk ich probiers
oh ich hab ja wirklich vergessen zu closen...

schonmal danke...


----------



## Krondor (23. Okt 2004)

Hat leider nix gebracht...
Noch immer derselbe Fehler 

--------------------------------

Hab mal nach dem einlesen die Daten direkt per System.out.print() ausgegeben
und ich stelle fest, dass das gelesene gleich mit dem in die Datei geschriebenen
ist. Aus diesem Grund gehe ich davon aus dass schon etwas mit dem einlesen 
schief geht!


----------



## Guest (23. Okt 2004)

Der Grund ist, dass Du versuchst Binärdaten als char zu schreiben.
Hier ein Beispiel, wie es funktioniert.

```
public static void main(String argv[]) {
  HttpURLConnection connection = null;
  BufferedInputStream in = null;
  BufferedOutputStream out = null;
  try {
    URL url = new URL(argv[0]);
    connection = (HttpURLConnection)url.openConnection();
    if(connection.getResponseCode()==HttpURLConnection.HTTP_OK) {
      
      in = new BufferedInputStream(connection.getInputStream());
      out = new BufferedOutputStream(new FileOutputStream(argv[1]));
      int bytesRead = 0;
      byte buffer[] = new byte[2048];
      while((bytesRead = in.read(buffer))>0)
        out.write(buffer, 0, bytesRead);
      out.flush();

    }
    else {
      System.out.println(connection.getResponseCode());
    }
  }
  catch(Exception e) {
    e.printStackTrace();
  }
  finally {
    try { if(in!=null) in.close(); } catch(Exception e) {}
    try { if(out!=null) out.close(); } catch(Exception e) {}
    if(connection!=null) connection.disconnect();
  }
}
```


----------



## Krondor (24. Okt 2004)

Hey super, danke!

Es scheint zu funktionieren.....

 :applaus:


----------



## bummerland (24. Okt 2004)

Anonymous hat gesagt.:
			
		

> ```
> byte buffer[] = new byte[2048];
> ```



Wie gross sollte bei solchen verbindungen eigentlich der buffer sein?


----------



## Guest (24. Okt 2004)

Hängt vom Stream ab. Optimal ist es, wenn dieser Puffer so gross ist wie 
der Puffer der Festplatte, von der gelesen wird, oder MTU der Internetverbindung etc.
Bedenke, dass BufferedInputStream auch einen internen Puffer hat.
Kurz gesagt, es ist am schnellsten, wenn der Puffer, ohne zu blockieren, auf einen 
Schlag vom gegebenen Stream gefüllt werden kann.
z.B.

```
...
byte buffer[] = new byte[in.available()]; 
System.out.println("Puffer Größe: " + buffer.length);
while((bytesRead = in.read(buffer))>0) {
  out.write(buffer, 0, bytesRead);
  System.out.println("available bytes: " + in.available());
}
...
```
Dazu kommt dann noch der Stream, in den Du schreibst (Datei).
Da kannst Du einfach davon ausgehen, dass es um einiges schneller ist
als Deine Internet-Verbindung.
Falls nicht, dann nenne Deinen Provider, ich werde sofort zu ihm wechseln


----------

