Dateidownload mit Java

Status
Nicht offen für weitere Antworten.

zilti

Bekanntes Mitglied
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?
 
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
 
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.
 
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:
Java:
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
 
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?
 
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:
Java:
final String sizeStr = conn.getHeaderField("Content-Length");
final long size;
if (sizeStr == null) {
  // unknown size
  size = -1;
} else {
  size = Long.parseLong(sizeStr);
}
Ebenius
 
jetzt wäre interessant wie man beim runterladen progressBar fühlt 🙂 danke voraus
 
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
 
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:
Java:
	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();
	}
 
FileOutputStream out = new FileOutputStream( update );
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben