# Dateidownload mit Java



## zilti (7. Mai 2009)

Hallo zusammen,
Offensichtlich bin ich mit meinem Problem laut Google und der Boardsuche die weltweit einzige Person mit diesem Problem.
Ich möchte mit InputStreamReader und OutputStreamWriter eine Datei a nach b herunterladen. Wenn möglich noch abrufen, wie gross die Datei auf dem Server ist.
Kann mir da jemand helfen?


----------



## Ebenius (7. Mai 2009)

Herunterladen? HTTP? Da gibt's einige HTTPClient-Implementationen die Dir sicher weiter helfen können. Zum Beispiel: HttpClient - HttpComponents HttpClient Overview

Wieso denn InputStreamReader under OutputStreamReader? Reader gibt's nur für Text, wenn Bytes zu Zeichen interpretiert werden sollen. Writer zum Schreiben entsprechend. Beschreib doch einfach mal Deinen Anwendungsfall vollständig, dann versteht man das sicher besser.

Ebenius


----------



## zilti (7. Mai 2009)

Nun, eigentlich möchte ich das ohne externe librarys machen.
Ja, stimmt - das ist nur für Text. Möglicherweise mit ein Grund, weshalb ich nichts fand.
Ich will eigentlich einfach nur eine Datei herunterladen. Also Streams auf, dann in ner while-Schleife Stück für Stück vom input- in den output-Stream schreiben.


----------



## Ebenius (7. Mai 2009)

zilti hat gesagt.:


> Ich will eigentlich einfach nur eine Datei herunterladen. Also Streams auf, dann in ner while-Schleife Stück für Stück vom input- in den output-Stream schreiben.


Soweit ist das einfach. Wenn Du tatsächlich nur Bytes herunterladen und abspeichern willst, dann brauchst Du keine andere Bibliothek. Wenn Du noch Cookies setzen musst, Encoding beachten, Dateigröße ermitteln willst (so sie Dir der Server denn mitteilt), dann wird's nicht so einfach. Wenn nicht, geht's in etwa so: 
	
	
	
	





```
public static void main(String[] args) throws Throwable {
  final URL url = new URL("http://www.java-forum.org/avatars/ebenius.gif");
  final URLConnection conn = url.openConnection();
  final InputStream is = new BufferedInputStream(conn.getInputStream());
  final OutputStream os =
        new BufferedOutputStream(new FileOutputStream("Ebenius_Avatar.gif"));
  byte[] chunk = new byte[1024];
  int chunkSize;
  while ((chunkSize = is.read(chunk)) != -1) {
    os.write(chunk, 0, chunkSize);
  }
  os.flush(); // Necessary for Java < 6
  os.close();
  is.close();
}
```
Ebenius


----------



## zilti (7. Mai 2009)

Danke, ja, so etwas das hab ich gesucht. 
Jetzt fehlt mir nur noch das mit der Dateigrösse, weisst du da grade ne Seite, wo was darüber draufsteht?


----------



## Ebenius (7. Mai 2009)

zilti hat gesagt.:


> Jetzt fehlt mir nur noch das mit der Dateigrösse, weisst du da grade ne Seite, wo was darüber draufsteht?


In etwa sowas nach Zeile drei einfügen: 
	
	
	
	





```
final String sizeStr = conn.getHeaderField("Content-Length");
final long size;
if (sizeStr == null) {
  // unknown size
  size = -1;
} else {
  size = Long.parseLong(sizeStr);
}
```
Ebenius


----------



## akkela (18. Sep 2011)

jetzt wäre interessant wie man beim runterladen progressBar fühlt  danke voraus


----------



## bygones (18. Sep 2011)

akkela hat gesagt.:


> jetzt wäre interessant wie man beim runterladen progressBar fühlt  danke voraus



ueber die headerinformation die gesamtgroesse bekommen. Beim lesen merken wieviel bytes man schon gelesen hat und dann die progressbar damit fuettern


----------



## akkela (22. Sep 2011)

bygones hat gesagt.:


> ueber die headerinformation die gesamtgroesse bekommen. Beim lesen merken wieviel bytes man schon gelesen hat und dann die progressbar damit fuettern



wäre nett wenn einer zu dem beispiel das wir hier oben haben sowas machen würde.


----------



## DerEisteeTrinker (22. Sep 2011)

sry aber selber schreiben macht schlau. befrage mal die SUFU hier, da findest genau wie das zu programmieren ist. da gibt es genug einträge. die inhalte vermischt du etwas und schon hast ne lösung


----------



## Network (22. Sep 2011)

Dafür gibt es dochh den ProgressMonitorInputStream!
Im Grunde wie ein normaler InputStream bloss mit eingebautem ProgressMonitor, die maximale Größe und die bereits übertragenen Daten ermittelt dieser automatisch!

Vollständiger Code um irgendwelche Bytes zu downloaden:

```
private void downloadFile( String http ) throws Exception {
		URL url = new URL( http );
		URLConnection uc = url.openConnection();
		InputStream is = (InputStream) uc.getInputStream();
		ProgressMonitorInputStream pmis = new ProgressMonitorInputStream( null, "Downloading...", is );
		pmis.getProgressMonitor().setMaximum( uc.getContentLength() );
		
		FileOutputStream out = new FileOutputStream( update );
		
		byte[] buffer = new byte[1024];
		for( int n; (n = pmis.read(buffer)) != -1; out.write(buffer, 0, n) );
		
		pmis.close();
		out.close();
	}
```


----------



## TheCreeper202 (12. Apr 2012)

was muss da bei "update" hin


----------



## TheCreeper202 (12. Apr 2012)

FileOutputStream out = new FileOutputStream( update );


----------



## ARadauer (12. Apr 2012)

Der Name der Datei wo du hinschreiben willst


----------



## TheCreeper202 (12. Apr 2012)

ach so danke


----------

