Pregunta

Estoy tratando de comprimir y archivar todos los archivos en una carpeta, usando la clase de tiempo de ejecución Java. Mi fragmento de código se ve como este:

public static void compressFileRuntime() throws IOException, InterruptedException {

    String date = Util.getDateAsString("yyyy-MM-dd");
    Runtime rt = Runtime.getRuntime();
    String archivedFile = "myuserData"+date+".tar.bz2";
    String command = "tar --remove-files -cjvf "+archivedFile+" marketData*";
    File f = new File("/home/amit/Documents/");
    Process pr = rt.exec(command, null, f);
    System.out.println("Exit value: "+pr.exitValue());
}

El código anterior no archiva y comprime el archivo como se esperaba, aunque crea un archivo myuserData2009-11-18.tar.bz2 en la carpeta "/home/amit/Documents/".

También la salida es

Exit value: 2.   

Mientras que si ejecuto el mismo comando desde la línea de comando, da el resultado esperado.

Por favor, dime qué me estoy perdiendo.

Gracias
Amit

¿Fue útil?

Solución

El problema radica en esta parte:

" marketData*"

esperas que los nombres de archivo se compriman * comodín. Globbing es realizado por el caparazón, no por las herramientas mismas. Tus opciones son para:

  • numerar los archivos para archivarse usted mismo
  • Inicie el shell para realizar el comando ("/bin/sh -c")
  • iniciar alquitrán en la carpeta que contiene los archivos a archivarse

Editar: Para la opción de shell, su comando se vería como:

String command = "sh -c \"tar --remove-files -cjvf "+archivedFile+" marketData*\"";

(importa el \"s que delimitan el comando que se ejecutará por el shell, no use citas individuales de la shell no interpretará el mundo).

Otros consejos

Si realmente desea crear un archivo BZIP2, utilizaría una implementación de Java en lugar de un comando nativo que sea bueno para la portabilidad, por ejemplo, el disponible en http://www.kohsuke.org/bzip2/ (Sin embargo, no está realmente optimizado, la compresión parece ser más lenta que con Java LZMA).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top