Jar-Datei per Java speichern

Rainbow

Bekanntes Mitglied
Hallo zusammen,
ich benötige ein Programm, dem ich eine URL übergebe in der man verschiedene jar-Datei Dateien herunterladen kann. Weil das sehr sehr viele jar-Dateien sind, soll es das Programm übernehmen, damit ich nicht 200 Dateien manuell herunterladen muss.
Gibt es da schon was vorgefertigtes?

Ich habe es zwar hinbekommen, das die Dateien heruntergeladen werden, aber diese sind nicht vollständig. Also manchmal stehen da nur 2 Dateien drin, obwohl es viel mehr sein müssten.
Manchmal wird mein Programm auch gestartet und dann kann ich Stunden warten, aber es passiert einfach nichts.
Von daher muss ich ja was falsch machen.
Hier mal meine Methode, die das wesentliche übernimmt:

Java:
	private void speicherJars(String url, File file) {
		BufferedInputStream bufferedInputStream = null;
		BufferedOutputStream bufferedOutputStream = null;

		try {
			bufferedInputStream = new BufferedInputStream(new URL(url).openStream());
			FileOutputStream fileOutputStream = new FileOutputStream(file);
			bufferedOutputStream = new BufferedOutputStream(fileOutputStream, 2048);
			byte[] data = new byte[2000];
			int x = 0;
			while((x = bufferedInputStream.read(data, 0, 2000)) >= 0) {
				bufferedOutputStream.write(data, 0, x);
			}
		}
		catch(FileNotFoundException e) {
			e.printStackTrace();
		}
		catch(MalformedURLException e) {
			e.printStackTrace();
		}
		catch(IOException e) {
			e.printStackTrace();
		}
		finally {
			try {
				if(bufferedInputStream != null) {
					bufferedInputStream.close();
				}
				if(bufferedOutputStream != null) {
					bufferedOutputStream.close();
				}
			}
			catch(IOException ex) {
				ex.printStackTrace();
			}
		}
	}

Liebe Grüße
Rainbow
 
Auf Anhieb würde ich sagen daß es statt
Java:
while((x = bufferedInputStream.read(data, 0, 2000)) >= 0) {
wie folgt lauten müßte.
Java:
while((x = bufferedInputStream.read(data)) > -1) {
Denn read liefert -1 wenn nichts mehr gelesen werden kann.
0 ist ein gültiger Wert und besagt nicht daß der Stream zu Ende ist.
 
Das macht keinen Unterschied.
Auch dabei kommt exakt das gleiche raus. Manche jar-Dateien sind zu klein und haben nur 1 Datei..andere haben von vornherein eine Größe von 0Kb und man kann sie auch nicht entpacken oder so.
 
Hm... komisch.
Hat es einen besonderen Grund weshalb du BufferedOutputStream bzw. BufferedInputStream verwendest?

An einem fehlenden Flush sollte es ja auch nicht liegen, da du ja jeweils die close Methoden aufrufst welche das laut Api Doc automatisch machen.

Wo kommen den die Jars her? Einfach ein Webserver? Wenn du die Jars über einen Browser herunterlädst sind die aber ok, ja?
 
Was mir in dem Code auffällt ist das der FileOutputStream nicht geschlossen wird. Die Buffered* Streams sind btw unnötig wenn man zum lesen und schreiben eh schon ein entsprechend großes byte[] als Puffer verwendet.
 
Also ich hab den Code so benutzt, weil ich ihn so als Beispiel im Netz gefunden hatte.
Wenn ich die Dateien manuell im Browser runterlade sind die in Ordnung.
Den FileOutputStream habe ich jetzt geschlossen, ist mir gar nicht aufgefallen..danke.
Die Buffered-Streams hab ich jetzt auch weggenommen.

Das ändert jedoch gar nichts daran, da die Dateien immer noch zu klein oder gleich 0Kb groß sind. Also nicht vollständig.
 
Zuletzt bearbeitet:
An sich sind die Daten frei zugänglich. Die URL die ich nehme, kann ich so jetzt leider nicht rausgeben. Aber das hat mich auf die Idee gebracht, einfach mal ne andere URL zu testen, wo man auch eine jar runterladen kann...und das funktioniert.
So dann kam mir die Idee, meine Methode nur mal mit einer URL aufzurufen...klappt wunderbar.

Das heißt, an meiner Methode liegt es gar nicht. Fragt sich nur warum es nicht klappt,wenn ich die Methode in ner while-Schleife aufrufe?

Also die Sache ist die, ich will die Dateien nicht irgendwo speichern, sondern in einer gewissen Ordnerstruktur, die ich mir per Programm aufbaue. Das klappt auch. Dann schau ich in der URL nach, wo ich denn die Datei hinstecken möchte. Das entscheid je nach Inhalt des Dateinamen, also nen einfaches contains(). Dann ruf ich halt entsprechend für jede URL die Methode zum Speichern auf.
Und die Dateien werden ja zumindest auch alle angelegt an der richtigen Stelle.

Also woran kann es liegen, das ich einzeln alles gut speichern kann, aber in der Schleife die Dateien zu klein werden?
Hatte auch schon mal nen sleep eingebaut, hat aber nichts gebracht.
 
ja das klappt

Hm...also ich hab halt bei jeder Datei immer das gleiche Ergebnis. Immer die gleiche Größe. Bei jedem Durchlauf.
Das mit dem zu schnell/häufig hab ich auch schon so vermutet, aber müsste es dann nicht mit einem Thread.sleep() besser klappen?

ich mein wenn ich die urls nacheinander manuell in den Browser eingebe klappts ja auch bei jeder Datei.
 
Es ist leider schwer so aus der Ferne dem Problem näher zu kommen.

Der Code zum Laden und Speichern der Jars sollte soweit passen.
Die Frage ist ja wieso zum Teufel die Jars dann falsch geschrieben werden bzw. falsch auf der Platte landen.
Passiert vielleicht außerhalb der Methode speicherJars() etwas was den Fehler verursacht oder passt irgendwas in der Kommunikation mit dem Server nicht.
Du sagst ja daß es mit einem einzelnen Aufruf von speicherJars() klappt.

Kannst du vielleicht noch ein paar Details über den Server erzählen?
Ist das einfach ein (Apache) Http-Server welcher ohne Umwege einfach die Dateien per Http bereitstellt?
Oder was ist das genau?
 
Also vielen Dank für die Hilfe, aber ich denke jetzt mittlerweile, das es wirklich an der Interseite liegt. Ich habe mein Programm jetzt so abgespeckt, das ich quasi nur in ner Schleife alles stur runterlade und keine anderen Methoden zwischendurch aufrufe....
Es kann einfach nicht am Code liegen.
Von daher geb ich mich damit jetzt einfach zufrieden.
 
So...es liegt an meinem Rechner. Anscheinend hab ich ein Netzwerkproblem oder so. Keine Ahnung, aber beim kollegen klappt es wunderbar. Also muss es ja an meinem Rechner liegen.
 
Hm... ok du hast zwar keine Lödung dafür daß es bei dir nicht geht aber immerhin geht es überhaupt.

Ich finde es allerdings ungewöhnlich daß es auf deinem Rechner nicht läuft.
 

Neue Themen


Zurück
Oben