# Download über URL



## muckelzwerg (13. Jul 2006)

Hola,

ich versuchs mal kurz darzustellen :

URL >> InputStream >> Reader >> Buffer >> Writer >> File

Ich hoffe, das erklärt, was ich gerade mache.
Ich muss aus einem Program heraus ein paar Dateien über http runterladen.
Was ich jetzt suche ist ein Artikel a.Ä. der über das Thema quer drübergeht.
An sich funzt das ja so ganz gut, aber bevor ich die Funktion abhake, wollte
ich noch ein bisschen nach dem "Drumrum" schauen. Gibts da noch was,
was man beachten sollte, irgendwelche gängigen Stolperfallen etc. ?
Was ist mit langsamen Downloads, die lange dauern ?
(mit dotnet gabs da irgendwelche "synchron/asynchron Probleme ...)
Wie ist das mit den Streams ? Im Moment hab ich
InputStreamReader > BufferedReader > BufferedWriter > FileWriter

mfG

  --  --  muckelzwerg


----------



## lope (13. Jul 2006)

muckelzwerg hat gesagt.:
			
		

> Hola,
> 
> ich versuchs mal kurz darzustellen :
> 
> ...



Genau eine ähnliche Frage zu dem habe ich auch.

Problem:

Ich downloade eine Datei über einen Socket, und versuche die Datei zu speichern.
Das ganze betrifft keine Textdateien, sondern ausführbare Dateien, oder Mp3s, etc.

Den HTTP-Header habe ich schon gefiltert, aber wie speicher ich nun die Datei richtig, so dass sie auch normal lesbar ist für jede Anwendung, die für diese entsprechende Datei geeignet ist.

Bislange habe ich das ganze mit einer Mp3 Datei probiert, der Titel wird angezeigt, die Länge des Song´s nicht. Die größe der Datei die gespeichert wird passt auch mit der Größe der Datei die auf dem Server liegt, von dem ich downloade.

Ich schließe mich meinem Vorreder mal an. 


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

Kleiner Auszug der Speicherung in meinem Programm:

			File file = new File("/home/chris/test.mp3");
			FileWriter schreiben = new FileWriter(file);
			BufferedWriter schreiben2 = new BufferedWriter(schreiben);
                        String s = null; // diese Variable dient zum Empfang der TCP Daten -> socket->readLine()
... download (TCP Daten werden ausgelesen, vorher gefiltert):

   		schreiben2.write(s);

wenn die Daten-Übertragung fertig ist:
schreiben2.flush();
schreiben2.close();

muss ich evtl einen anderen StreamWriter nutzen, um Mp3 Dateien etc. zu speichern?


----------



## muckelzwerg (13. Jul 2006)

Mal ganz grob umrissen

```
HttpURLConnection connection = HttpURLConnection) url.openConnection();
connection.connect();       
Reader in = new BufferedReader( new InputStreamReader (connection.getInputStream()));
Writer out = new BufferedWriter( new FileWriter( new File("filename") ));
int c;
while ((c = in.read()) != -1)
    out.write(c);
in.close();
out.close();
```

Ist ausm Kopf, hab jetzt keinen Zugriff auf das Prog, also eine Grantie.
(So hab ich angefangen, inzwischen siehts noch etwas anders aus.)

Ich hab aber eine coole Downloaderklasse gefunden, von der werd ich mich wohl inspirieren lassen.

  --  --  muckelzwerg


----------



## lope (13. Jul 2006)

muckelzwerg hat gesagt.:
			
		

> Mal ganz grob umrissen
> 
> ```
> HttpURLConnection connection = HttpURLConnection) url.openConnection();
> ...



Ich habe eben festgestellt, dass mein Programm aus einer 56kb großen Datei (Server liegend), eine 100kb Große Datei macht (die auf meinem PC gespeicherte Datei). Ideen woran das liegen könnte?


---

import java.io.*;
import java.net.*;
import java.util.*;
public class test {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		InputStream is = null;
		File file= new File("/home/chris/TEST.jpg");
		BufferedWriter x = new BufferedWriter(new FileWriter(file));
		String daten="";
		try {
			  URL test2 = new URL("http://www.etw.de/windtunnel/ts/model.jpg");
			  is = test2.openStream();

			  Scanner z = new Scanner(is);
			  String nl=null;
			  while (z.hasNextLine()) {
				  nl = z.nextLine();
				  System.out.println(nl);
				  daten = daten + nl;
			  }
			  daten = daten.replace("\n","");

			  x.write(daten);

			  x.close();

			}
			catch ( MalformedURLException e ) {
			  // Fehlerbehandlung
			}
	}


----------



## lhein (13. Jul 2006)

Hab son Tool schon geschrieben. Wenn bis morgen noch keiner ne Antwort geschrieben hat, dann poste ich es mal wenn ich es noch finde.

gruß
lr


----------



## Murray (13. Jul 2006)

BufferedReader und BufferedWriter sind für textuelle Daten gedacht; mit Binärdaten können die nicht korrekt umgehen. Und wenn es um JPEGs oder MP3s geht, dann sind das natürlich Binärdaten.
Also besser FileInputStream und FileOutputStream (ggfs. in Kombination mit BufferedInputStream und BufferedOutputStream) verwenden.


----------



## muckelzwerg (13. Jul 2006)

Hm, also ich hab mit der Variante problemlos jpgs übertragen können.
Hab aber den downloader gefunden, ich denke da ist so ziemlich alles dabei.
Werd ihn ein bisschen anpassen und dann ists gut.
Vielleicht interessiert es ja noch andere, oder es mag mal jemand drüberschauen.
http://www.java-tips.org/java-se-tips/javax.swing/how-to-create-a-download-manager-in-java.html

Den GUI kram kann man ja erstmal ignorieren, mir gehts nur um die Downloadklasse,
die find ich bisher sehr gut.

  --  --  muckelzwerg


----------



## lope (13. Jul 2006)

Murray hat gesagt.:
			
		

> BufferedReader und BufferedWriter sind für textuelle Daten gedacht; mit Binärdaten können die nicht korrekt umgehen. Und wenn es um JPEGs oder MP3s geht, dann sind das natürlich Binärdaten.
> Also besser FileInputStream und FileOutputStream (ggfs. in Kombination mit BufferedInputStream und BufferedOutputStream) verwenden.



das wollte ich hören.  :lol:


----------

