Domanda

Al momento sto lavorando su un'applicazione web che coinvolge il montaggio di un azionamento e l'estrazione di un file tar.gz, il tutto in Java. Dal momento che l'applicazione viene eseguita in un ambiente Linux, ho pensato che mi piacerebbe provare Uso dei comandi UNIX come "monte" e "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();

L'esecuzione del comando comando mount e l'estratto nel terminale funziona bene, ma non riesce quando prima esecuzione in Java. Il secondo proc.waitFor () restituisce il codice di uscita 2. Tuttavia, l'esecuzione di questo codice dopo il primo tentativo fallito funziona bene. Ho la sensazione che il problema è che waitFor () non è in attesa fino a quando il comando mount è completato. Mi sto perdendo qualcosa di importante nel mio codice?

Inoltre, preferirei fare tutto questo in Java, ma ho avuto un momento davvero difficile capire come scompattare un file, quindi sto prendendo questo approccio. (Oh se qualcuno può dirmi come fare questo sarei molto felice). Ogni suggerimento sarà apprezzato muuuuuuuuuuch!

È stato utile?

Soluzione 2

fare progressi. Nel caso qualcuno si stava chiedendo, ecco come sto estrazione di un file tar.gz in Java. Mettere insieme da un paio di tutorial online.

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();
}

Altri suggerimenti

risposta rapida

Da una dipendenza comandi esterni esiste, semplificare così:

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

Nome esso mount-extract.sh quindi chiamare utilizzando una singola chiamata Runtime.exec().

risposta semi-integrato

Utilizzare le API Java.

Sarà necessario Runtime.exec per eseguire il comando mount.

Forward Looking

Dal momento che Java è uno strumento di sviluppo software multipiattaforma, si consideri astraendo il comando mount nell'applicazione per essere derivata in modo dinamico in base al sistema operativo sottostante.

Si veda: Come posso montare una finestra di auto in Java ?

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

Naturalmente, lo sviluppo Agile avrebbe insistito che questo non può essere fatto fino a quando è necessario. Quindi, tenerlo nella parte posteriore della vostra mente fino a quel momento (come si potrebbe mai eseguire l'applicazione su qualsiasi cosa ma i sistemi basati su Unix).

Date un'occhiata alla org.apache.tools.tar pacchetto nella codebase Ant. C'è una classe in quel pacchetto, TarInputStream , che può essere utilizzato per leggere gli archivi tar.

Si può essere correlato al modo in cui si chiama il metodo.

rispondere

In sostanza provare a utilizzare

.exec( String [] command );

anziché

.exec( String command );

Non sono sicuro se è ancora correlata, in quanto si parla si corre la seconda volta. Fare un tentativo e fateci sapere.

Tutto questo può essere fatto in Java, ma si deve essere consapevoli di avvertimenti quando si tratta di processi nativi.

Il comando waitFor () non può essere fare ciò che si spera: se il processo è stato avviato è un processo figlio che fa il vero lavoro è necessario quindi il waitFor (), che restituisce quando il processo padre è finito, non ha permesso tempo sufficiente per il processo figlio per terminare.

Un modo per aggirare il problema è quello di un ciclo su alcuni test per vedere che i processi nativi hai iniziato hanno finito per la vostra soddisfazione --- in questo caso forse controllando se qualche java.io.File esiste.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top