Downloads korrupt

Status
Nicht offen für weitere Antworten.

Krondor

Aktives Mitglied
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!

Code:
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");
		}
	}
}
 
B

Beni

Gast
Diese Umwandlung des Integers in einen Char kommt mir seltsam vor, versuchs mal ohne.
Code:
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

Aktives Mitglied
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!
 
G

Guest

Gast
Der Grund ist, dass Du versuchst Binärdaten als char zu schreiben.
Hier ein Beispiel, wie es funktioniert.
Code:
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();
  }
}
 
G

Guest

Gast
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.
Code:
...
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 ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K optimale HTTP Downloads Netzwerkprogrammierung 15
C DatagramPacket korrupt? Netzwerkprogrammierung 2

Ähnliche Java Themen


Oben