Frage

Im Moment arbeite ich auf einer Web-Anwendung, die ein Laufwerk und Extrahieren eine tar.gz-Datei, die alle in Java beinhaltet Montag. Da die Anwendung in einer Linux-Umgebung ausgeführt wird, dachte ich, würde ich versuchen, mit Unix wie „mount“ -Befehle und „tar“.

Runtime runtime = Runtime.getRuntime();
Process proc;

String mountCommand = "mount -t cifs -o username=...";
String extractCommand = "tar xzf ..."

proc = runtime.exec(mountCommand);
proc.waitFor();

proc = runtime.exec(extractCommand);
proc.waitFor();

Ausführen des Befehls mount und Extract-Befehl im Terminal funktioniert gut, aber nicht, wenn der erste Lauf in Java. Die zweite proc.waitFor () gibt Exit-Code 2 jedoch diesen Code ausgeführt wird, nachdem der erste Versuch fehlgeschlagen funktioniert gut. Ich habe das Gefühl, dass das Problem ist, dass waitFor () nicht zu warten, bis der Befehl mount vollständig abgeschlossen ist. Bin ich etwas Wichtiges in meinem Code fehlt?

Auch würde ich lieber tun dies alles in Java, aber ich hatte eine wirklich harte Zeit, herauszufinden, wie eine Datei entpacken, so nehme ich diesen Ansatz. (Oh, wenn jemand kann mir sagen, wie dies zu tun, würde ich sehr glücklich sein). Alle mögliche Vorschläge würden muuuuuuuuuuch geschätzt!

War es hilfreich?

Lösung 2

Der Fortschritt. Im Fall fragt sich jemand, hier ist, wie ich eine tar.gz-Datei in Java am extrahieren. Zusammengestellt von einigen Online-Tutorials.

public static void extract(String tgzFile, String outputDirectory)
    throws Exception {

// Create the Tar input stream.
FileInputStream fin = new FileInputStream(tgzFile);
GZIPInputStream gin = new GZIPInputStream(fin);
TarInputStream tin = new TarInputStream(gin);

// Create the destination directory.
File outputDir = new File(outputDirectory);
outputDir.mkdir();

// Extract files.
TarEntry tarEntry = tin.getNextEntry();
while (tarEntry != null) {
    File destPath = new File(outputDirectory + File.separator + tarEntry.getName());

    if (tarEntry.isDirectory()) {
    destPath.mkdirs();
    } else {
    // If the parent directory of a file doesn't exist, create it.
    if (!destPath.getParentFile().exists())
        destPath.getParentFile().mkdirs();

    FileOutputStream fout = new FileOutputStream(destPath);
    tin.copyEntryContents(fout);
    fout.close();
    // Presserve the last modified date of the tar'd files.
    destPath.setLastModified(tarEntry.getModTime().getTime());
    }
    tarEntry = tin.getNextEntry();
}
tin.close();
}

Andere Tipps

Schnell Antwort

Da eine Abhängigkeit von externen Befehlen vorhanden ist, vereinfacht es wie folgt aus:

#!/bin/bash
mount -t cifs -o username=...
tar xzf ...

Name es mount-extract.sh dann rufen sie einen einzigen Runtime.exec() Anruf mit.

Teilintegrierte Antwort

Mit Java-APIs.

Sie werden Runtime.exec müssen den Mount-Befehl auszuführen.

Forward Looking

Da Java ist ein plattformübergreifende Software-Entwicklungs-Tool, sollten Sie den Befehl mount in der Anwendung abstrahiert abgeleitet basierend auf dem zugrunde liegenden Betriebssystem dynamisch werden.

Siehe auch: Wie kann ich einen von Windows in Java fahren ?

Siehe auch: http : //java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#getProperties ()

Natürlich würde Agile Entwicklung betont, dass dies nicht, bis es benötigt wird, durchgeführt werden. So halten es in der Rückseite Ihres Geistes, bis dann (wie Sie vielleicht nie die Anwendung auf alles andere als Unix-basierten Systemen ausgeführt werden).

Werfen Sie einen Blick auf die org.apache.tools.tar Paket in der Ant-Codebasis. Es gibt eine Klasse in diesem Paket, TarInputStream , die verwendet werden können, um tar-Archive zu lesen.

Es kann auf die Art und Weise in Beziehung gesetzt werden Sie die Methode aufrufen.

Sehen Sie diese

Im Grunde versuchen Sie es mit

.exec( String [] command );

statt

.exec( String command );

Ich bin mir nicht sicher, ob es noch verwandt ist, da Sie erwähnen es zum zweiten Mal ausgeführt wird. Probieren Sie es aus und lassen Sie es uns wissen.

Dies kann alles in Java getan werden, aber Sie haben Vorbehalte bewusst sein, wenn sie mit nativen Prozessen beschäftigen.

Der waitFor () Befehl kann nicht tun, was Sie hoffen: Wenn der Prozess, den Sie begann ein Kind-Prozess hat, der die eigentliche Arbeit erledigt müssen Sie die waitFor dann (), die zurückgibt, wenn der übergeordnete Prozess beendet hat, hat nicht erlaubt genügend Zeit für das Kind zu beenden.

Eine Möglichkeit, dies zu umgehen ist über einigen Test-Schleife, um zu sehen, dass die nativen Prozesse, die Sie abgeschlossen haben begonnen zu Ihrer Zufriedenheit --- in diesem Fall vielleicht zu überprüfen, ob einige java.io.File vorhanden ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top