Größe eines InputStreams ermitteln

Hallo,
ich schreibe gerade ein Programm welches Dateien aus dem Internet herunterlädt - nicht irgendwelche sondern ganz spezielle. Deshalb ändere ich auch den Browser-Agent. Folgendes funktioniert auch ganz wunderbar, allerdings würde ich gerne einen Fortschrittsbalken haben. Soweit auch keinb Problem, allerding weiß ich nicht wie ich die Größe des InputStream ermitteln kann. Mit available() erhalte ich einen Wert - dieser stimmt jedoch nachweißlich nicht.

Hier der Code:

URL link = new URL(str);
//HttpURLConnection verb = (HttpURLConnection)link.openConnection();
HttpURLConnection verb = (HttpURLConnection)link.openConnection();

verb.addRequestProperty(„User-Agent“, userAgent);
verb.setRequestMethod(„GET“);

verb.connect();
int responseCode = verb.getResponseCode();

if (responseCode == HttpURLConnection.HTTP_OK) {
byte tmp_buffer[] = new byte[4096];
InputStream iS = verb.getInputStream();
int n = 0;
double bisherAbgerufen = 0.0;

FileOutputStream oS = new FileOutputStream(datei);

//Anzeige öffnen
this.frame.setVisible(true);
this.frame.jLbl_gesamt.setText(Integer.toString(iS.available()));

while ((n = iS.read(tmp_buffer)) > 0) {
oS.write(tmp_buffer, 0, n);
oS.flush();

verb.
bisherAbgerufen = bisherAbgerufen + (double)n;
this.frame.jLbl_aktuell.setText(Double.toString(bisherAbgerufen));
}

oS.close();

Ich würde auch eine andere Variante als die über InputStream verwenden - die Änderung des User-Agents muss jedoch möglich sein!

Vielen Dank schonmal,
Florian L.

Hallo,

Mit available() erhalte ich einen
Wert - dieser stimmt jedoch nachweißlich nicht.

Das betont die Dokumentation dieser Methode auch: InputStream#available()

Hier der Code:

URL link = new URL(str);

//HttpURLConnection verb =
(HttpURLConnection)link.openConnection();

HttpURLConnection verb =
(HttpURLConnection)link.openConnection();

Ein HTTP Server sendet normalerweise die Größe der (HTML) Datei im Header als Content-Length.

Dieser Code listet alle Header auf:

 for(String key : verb.getHeaderFields().keySet())
 {
 System.out.println(key + ": " + verb.getHeaderField(key));
 }

HTH
Heavy

Hallo,
danke Dir Heavy! Wunderbare Lösung. Das available() ungenau ist wusste ich auch schon aus dem API, war aber der einzige mir bekannte Weg weshalb ich ihn ausprobiert habe!

Vielen Dank nochmal!

Grüße,
Florian L.