2009-11-18 3 views
0

J'essaye de compresser et d'archiver tous les fichiers dans un dossier, en utilisant la classe Java Runtime. Mon extrait de code semble que ceci:Compresser et archiver les fichiers dans le dossier en utilisant Java Runtime

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

Le code ci-dessus n'archive et compresser le fichier comme prévu, mais il crée un fichier myuserData2009-11-18.tar.bz2 dans le dossier « /home/amit/Documents/ ».

également la sortie est

Exit value: 2. 

Alors que si j'exécute la même commande de la ligne de commande, il donne le résultat attendu.

S'il vous plaît dites-moi ce que je manque.

Merci
Amit

Répondre

2

Le problème se trouve dans cette partie:

" marketData*" 

vous attendent les noms de fichiers à compresser à globbed du caractère générique *. Globbing est fait par la coquille, pas par les outils eux-mêmes. vos choix sont soit:

  • numératie les fichiers à vous archivés
  • démarrer le shell pour exécuter la commande («/bin/sh -c »)
  • goudron de départ sur le dossier contenant les fichiers à archiver

Modifier: pour l'option shell, votre commande ressemblerait à ceci:

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

(l'esprit les \" s qui délimitent la commande à exécuter par le shell, ne pas utiliser de guillemets simples ot la coquille ne pourra pas interpréter le glob.)

+0

Merci rsp. Mais le dossier contient de nombreux autres types de fichiers et je n'ai besoin d'archiver que les fichiers commençant par marketData. Les fichiers sont également exportés par FTP dans ce dossier et le nombre de fichiers varie. Il semble donc difficile d'utiliser la 1ère ou la 3ème méthode spécifiée par vous. Je vais essayer avec le 2ème. Pouvez-vous nous en dire un peu plus à ce sujet? Merci, – Amit

+0

Cela a fonctionné Merci – Amit

1

(pas de réponse à votre question, plus d'une suggestion) Pourquoi ne pas essayer this à la place.

+0

Pour deux raisons principales, je n'ai pas essayé ce qui précède: 1. La compression est meilleure au format bz2. J'ai besoin de compresser les fichiers juste une fois par jour. 2. Je dois supprimer les fichiers qui ont été archivés, le tout en une seule fois. – Amit

1

Si vraiment vous voulez créer une archive bzip2, J'utiliserais une implémentation Java au lieu d'une commande native qui est bonne pour la portabilité, par exemple celle disponible en http://www.kohsuke.org/bzip2/ (elle n'est pas vraiment optimisée, la compression semble être plus lente qu'avec Java LZMA).

Questions connexes