Pergunta

Atualmente estou trabalhando em uma aplicação web que envolve a montagem de uma unidade e extrair um arquivo tar.gz, tudo em Java. Desde o aplicativo é executado em um ambiente Linux, eu percebi que eu tente usar comandos UNIX como "montar" 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();

A execução do comando e comando de extração de montagem na obra fina terminal, mas falha quando executado pela primeira vez em java. A segunda proc.waitFor () retorna código de saída 2. No entanto, executar este código após a primeira tentativa falhou funciona bem. Tenho a sensação de que o problema é que waitFor () não está esperando até que o comando de montagem está totalmente concluída. Estou faltando alguma coisa importante no meu código?

Além disso, eu prefiro fazer isso tudo em Java, mas eu tive um momento muito difícil descobrir como descompactar um arquivo, então eu estou tomando esta abordagem. (Oh, se alguém pode me dizer como fazer isso eu ficaria muito feliz). Todas as sugestões serão muuuuuuuuuuch apreciada!

Foi útil?

Solução 2

Fazendo progresso. No caso de alguém estava pensando, aqui está como eu estou extraindo um arquivo tar.gz em Java. Coloque junto de alguns tutoriais on-line.

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

Outras dicas

Resposta Rápida

Uma vez que a dependência de comandos externos existe, simplificá-lo como este:

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

Nome lo mount-extract.sh então chamá-lo usando uma única chamada Runtime.exec().

Resposta Semi-integrada

Usar APIs Java.

Você vai precisar Runtime.exec para executar o comando de montagem.

Forward Looking

Uma vez que Java é uma ferramenta de desenvolvimento de software multi-plataforma, considere abstrair o comando montar em seu aplicativo para ser derivado dinamicamente com base no sistema operacional subjacente.

Veja: Como posso montar um Windows dirigir em Java ?

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

É claro, o desenvolvimento Agile insistiria que este não pode ser feito até que seja necessário. Assim, mantê-lo na parte traseira de sua mente até então (como você nunca pode executar o aplicativo em qualquer coisa, mas sistemas baseados em Unix).

Dê uma olhada no org.apache.tools.tar pacote na base de código Ant. Há uma classe no pacote, TarInputStream , que pode ser usado para ler arquivos tar.

Pode estar relacionado à maneira como você chamar o método.

Veja esta resposta href="https://stackoverflow.com/questions/1080578/i-dont-understand-why-this-classnotfoundexception-gets-thrown/1080800#1080800">

Basicamente tentar usar

.exec( String [] command );

em vez de

.exec( String command );

Eu não tenho certeza se ele está mesmo relacionada, porque você mencionou é executado pela segunda vez. Dê-lhe uma tentativa e deixe-nos saber.

Isso tudo pode ser feito em Java, mas você tem que estar ciente de advertências quando se lida com processos nativos.

O comando waitFor () pode não estar fazendo o que você espera: se o processo que começou tem um processo filho que faz o trabalho real que você precisa, em seguida, o waitFor (), que retorna quando o processo pai terminar, não permitiu tempo suficiente para o processo filho ao fim.

Uma maneira de contornar este problema é fazer um loop sobre algum teste para ver que os processos nativos que você começou ter terminado a sua satisfação --- neste caso, talvez verificando se algum java.io.File existe.

scroll top