Input/Output CMD-Ausgabe abfangen und in Datei speichern

  • Themenstarter Themenstarter Gelöschtes Mitglied 28048
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 28048

Gast
Hallo!

Habe eine Frage bezüglich der CMD-Ausgabe. Kann man diese mit dem Standart-Befehl "> C:\verzeichnis\ordner\filename.dateiendung" abfangen bzw. abspeichern. Habe nämlich folgende Methode, jedoch speichert diese nichts ab. Fehlermeldungen kommen aber auch nicht :bahnhof:...

Java:
Process proc = rt.exec("C:\\xampp\\mysql\\bin\\mysqldump -h" + host + "-u " + user + " -p" + pw + " --allow-keywords --add-drop-table --complete-insert --quote-names "  + "database" + " > C:\\verzeichnis\\ordner\\exportfile.sql");

host, user und pw stellen dabei variablen, die ich vorher als String mit den enstprechenden Zugangsdaten initialisiert habe. :rtfm:

Habe schon gegoogled und die Sufu benutzt, kam aber auf keine Antwort.


Es wäre super, wenn mir hier ein wenig weiterhelfen könnte.

Alternativ habe ich mir schon etwas ausgedacht bzw. zusammengegoogled mit einem InputStream(Reader) und nem Filewriter, dass jedoch noch nicht so funktioniert wie ich das will...


Viele Grüße und auf eine Antwort hoffend

Olli123
 
" -p" + pw
Da is kein Leerzeichen nach dem p, gib mal deinen String aus den du dir baust und schau ob der in der CMD das macht was du willst
 
der string funktioniert in cmd ohne probleme. habe es nämlich genau so abgtippt und in cmd einfgefügt, halt mit den entsprechenden variablen-werten.

das mit dem leerzeichen muss so sein. also sollte es von der syntax her eigentlich passen. die frage ist ob java das zulässt, dass cmd etwas schreiben soll... ???:L
 
Lass das > blabla einfach weg und hol dir per getInputStream die Ausgabe deines Prozesses. Das kannst dann nach belieben weiterverarbeiten und auch in einer Datei speichern.
 
hmmm habe das dann so als alternative, aber da fehlt zum teil immer ein Bisschen was, sodass das file nicht verwendbar ist:

Java:
public void getLocalDatabase()
    {
        String host = "host",user="user",pw="pw";
        File dump = new File("database\\file.sql");
        FileWriter fw = null;
        try
        {
            fw = new FileWriter(dump);
            Runtime rt = Runtime.getRuntime();
            Process child = rt.exec("C:\\xampp\\mysql\\bin\\mysqldump -h" + host + "-u " + user + " -p" + pw + " --allow-keywords --add-drop-table --complete-insert --quote-names "  + "database");
            InputStream in = child.getInputStream();
            InputStreamReader xx = new InputStreamReader(in,"UTF-8");
            char[] chars = new char[1024];
            int ibyte = 0;
            while((ibyte = xx.read(chars))>0)
            {
                System.out.println(chars);
                fw.write(chars);
            }
            fw.close();
        }
        catch (Exception e) {
        e.printStackTrace();
        }
    }


Aber wo liegt da der Fehler... Es fehlt immer am Ende einer Datenbank ein gewisser Teil... :shock:
 
mach ich morgen aber danke schonmal für die hilfe... nur ich bin jetzt viel zu müde um weiter zu machen...
 
Hab den Thread nur überflogen aber folgendes solltest Du ändern:
[JAVA=15]while((ibyte = xx.read(chars))>0)[/code]
Code:
while((ibyte = xx.read(chars))[SIZE="4"][B]!=-1[/B][/SIZE])

Eventuell wird ja ein Teil auch über den Errorstream ausgegeben. Kannst ja dieses auch mal auslesen bzw. in die Datei umleiten:
Code:
   ...   > meineDatei.xxx 2>&1
 
Eventuell wird ja ein Teil auch über den Errorstream ausgegeben. Kannst ja dieses auch mal auslesen bzw. in die Datei umleiten:
Code:
   ...   > meineDatei.xxx 2>&1

Wie meinst du das genau? verstehe den quellcode leider nicht. und warum wird ein teil über nen errorstream ausgegeben? ich sehe in dem file, welches er anlegt immer nur, dass er mitten bei den datensätzen abbricht und dann einfach der nächste satz bzw. die nächste zeile beginnt.

ungefähr so:

SQL:
(bla, bla, bla, bla),(bla, bla, bla,/*!40000 ALTER TABLE `tablename` ENABLE KEYS */;
UNLOCK TABLES;

Das heißt irgendwie fehlt so der letzte abschnitt, der nicht geschrieben wird.... 🙁


Edit: Habe mir das ganze nochmal genauer angeschaut und habe festgestellt, dass er die sachen nicht zu wenig schreibt, sonder manche Sachen zu viel, also ein zweites Mal schreibt... Die Frage ist nur warum er das macht...


Edit2: Hab die Lösung gefunden... eigentlich ganz logisch wenn man draufkommt... hier die Lösung und danach Erklärung dazu:


Java:
public void getLocalDatabase()
    {
        String host = "host",user="user",pw="pw";
        File dump = new File("database\\file.sql");
        FileWriter fw = null;
        try
        {
            fw = new FileWriter(dump);
            Runtime rt = Runtime.getRuntime();
            Process child = rt.exec("C:\\xampp\\mysql\\bin\\mysqldump " + "-u" + user + " -p" + pw + " --allow-keywords --add-drop-table --complete-insert --quote-names "  + "database");
            InputStream in = child.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(in,"UTF-8"));
            int ibyte = 0;
            while((ibyte = br.read())!= -1)
            {
                fw.write(ibyte);
            }
            fw.close();
        }
        catch (Exception e) {
        e.printStackTrace();
        }
    }


Habe noch aus Schönheitsgründen einen BufferedReader eingebaut.

Erklärung: In der While-Schleife frägt der bufferedReader br mit der Methode
Java:
br.read()
ab ob noch Zeichen übrig sind. Dadurch verschiebt sich aber der Curser um eins. Wenn ich dann in der Schleife nochmal
Java:
br.read()
abfrage, kommt nur die Hälfte an. Um das zu umgehen weist man mit
Java:
(ibyte = br.read())
ibyte als Speicher für das sonst verloren gegangene Zeichen zu. Dieses wird dann in der while-Schleife in das File geschrieben. Und schon funktioniert es =)


Trotzdem vielen dank an euch Alle!!!

Grüße

Olli123
 
Zuletzt bearbeitet:

Zurück
Oben