Comprimir y archivar los archivos en la carpeta usando Java Runtime
-
20-09-2019 - |
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
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).