Daten downloaden

Migu

Mitglied
Hallo

ich habe mir ein kleines Testprogramm um meteorologische Beobachtungsdaten runterzuladen, aber irgendwie klappt das nicht so ganz....
Mein Code:

Java:
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;

public class Test {
    
    public static String path = "/home/migu/Desktop/GMT/Synop/";
    
    public static void downloadData() throws IOException {
        Calendar currentDate = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
        Calendar beforeDate  = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
        beforeDate.add(Calendar.HOUR_OF_DAY, -2);
        
        final String startTime = new SimpleDateFormat("yyyyMMddHH'00'").format(beforeDate.getTime());
        final String endTime   = new SimpleDateFormat("yyyyMMddHH'00'").format(currentDate.getTime()); 
        
        String command = "wget \"http://www.ogimet.com/cgi-bin/getsynop?state=Ger&begin=" + startTime + "&end=" + endTime + "\" -O " + path + "data.txt";
        Runtime runtime = Runtime.getRuntime();
        Process process = runtime.exec(command);
    }
    
    public static void main(String[] args) {   
        try {
            downloadData();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        
    }
}

Es klappt alles bis auf das Ausführen des Befehls "wget".
Irgendeine Idee warum das nicht klappt?

Gruss
Migu
 
Achso ja ...
Die output Datei wird zwar erstellt ist aber leer.
Wenn ich den selben Befehl in der Shell eingebe dann klappt alles wie es soll.

Mit Befehl meine ich wget
Gruß
Migu
 
Runtime@java2s

Hier findest du zu allen Methoden ein Beispiel

Wenn ich folgendes schreibe (nach dem Beispiel auf der Webseite) dann klappts, d.h. Kate wird aufgemacht

Java:
Runtime r = Runtime.getRuntime();
        try {
            Process p = r.exec("kate");
        } catch (IOException ex) {
            ex.printStackTrace();
        }

Übrigens alles unter Linux.
Komisch bleibts trotzdem warum das klappt.

Gruß
Migu
 
Hallo

weiss denn niemanden warum es nicht klappt ein Shellbefehl auszuführen??

Oder vielleicht kann mir jemand einen Tipp geben mit welche Klasse man direkt in java daten aus dem Internet downloaden kann.

Schon mal danke im Vorraus
Migu
 
Nimm zum ausführen besser den ProcessBuilder. Außerdem musst du immer den output und errorstream des Prozesses leeren, sonst blockt der.

Oder vielleicht kann mir jemand einen Tipp geben mit welche Klasse man direkt in java daten aus dem Internet downloaden kann.
URLConnection, HTTPClient?
 
Yep danke für den Input. Klappt!

Aber warum klappt denn das ausführen eines Systembefehls nicht? Das verstehe ich nicht....

Migu
 
Ja, auf der Konsole (Linux) klappt es wunderbar. ZB sowas

wget "http://www.ogimet.com/cgi-bin/getsynop?state=Ger&begin=201207021500&end=201207021700" -O data.txt
 
Tipp ins Blaue:

Versuche mal nach dem Starten des Prozesses ein:
Code:
process.waitFor();
damit der Prozess auch die Chance hat sich selbst abzuarbeiten.

Greetings...
 
Das hatte ich auch schon ausprobiert aber kein Erfolg.
Da Programm läuft fehlerfrei durch und erzeugt auch die Datei, lädt aber nichts aus dem Internet runter...

Mir fällt nichts ein warum das passiert.
 
Habe das gerade mal getestet. wget liefert eine Fehlermeldung, deshalb ist die Datei auch leer.

Du solltest den Fehlerkanal vom Thread in einem separaten Thread auslesen und Dir ausgeben lassen.
 
Komisch bei mir kommt keine Fehlermeldung
Hier ist der Output des Fehelerkanals


--2012-07-09 21:57:01-- http://www.ogimet.com/cgi-bin/getsynop?state=Germany&begin=201207091900&end=201207092100
Auflösen des Hostnamen »Entrada de Ogimet (www.ogimet.com)«... 188.165.206.87
Verbindungsaufbau zu Entrada de Ogimet (www.ogimet.com)|188.165.206.87|:80... verbunden.
HTTP-Anforderung gesendet, warte auf Antwort... 200 OK
Länge: nicht spezifiziert [text/plain]
In »»data.txt«« speichern.

0K .......... .......... ... 247K=0,1s

2012-07-09 21:57:02 (247 KB/s) - »»data.txt«« gespeichert [24195]


Befehl war in der Shell

wget "http://www.ogimet.com/cgi-bin/getsynop?state=Germany&begin=201207091900&end=201207092100" -O data.txt 2> log


gruss
Migu
 
Hast Du das jetzt in der Shell eingetippt oder hast Du es vom Java-Programm aus gestartet und dort dann den Fehlerkanal ausgelesen?

Runtime.getRuntime().exec(...) != Linux Shell

Wenn ich es direkt in der Shell eintippe, funktioniert es bei mir auch. Aber vom Java-Programm aus wird ein Fehler ausgegeben.
 
Ich habs in der Linux-Shell eingegeben und da den Fehlerkanal ausgelesen.

So, aber wenn das ich in Java mache

Java:
public class Test {
    public static void main(String[] args) {
        Runtime runtime = Runtime.getRuntime();
        try {
            Process process = runtime.exec("wget \"http://www.ogimet.com/cgi-bin/getsynop?state=Germany&begin=201207091900&end=201207092100\" -O data.txt");
            process.waitFor();
            InputStream in =  process.getErrorStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            while(reader.ready()) {
                System.out.println(reader.readLine());
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (InterruptedException ex) {
                ex.printStackTrace();
        }
        
    }
}

dann bekomme ich folgende Fehlermeldung:
"http://www.ogimet.com/cgi-bin/getsynop?state=Germany&begin=201207091900&end=201207092100": Schema fehlt.

Nur bin ich da überfragt... was soll das heissen "schema fehlt"?
 
Benutz besser den ProcessBuilder:

Java:
public static void main(String[] args) {
	try {
		ProcessBuilder pb = new ProcessBuilder();
		pb.command("wget",
				"http://www.ogimet.com/cgi-bin/getsynop?state=Germany&begin=201207091900&end=201207092100", "-O",
				"data.txt");
		Process process = pb.start();
		
		process.waitFor();
		InputStream in = process.getErrorStream();
		BufferedReader reader = new BufferedReader(new InputStreamReader(in));
		while (reader.ready()) {
			System.out.println(reader.readLine());
		}
	} catch (IOException ex) {
		ex.printStackTrace();
	} catch (InterruptedException ex) {
		ex.printStackTrace();
	}
}
 

Zurück
Oben