2013-06-29 111 views
0

我有一个ProcessBuilder应删除File.txt,然后重命名NewFile.txt。 问题是两个文件都被删除。任何想法为什么以及如何解决?ProcessBuilder删除和重命名

public class MyProcessBuilder { 

    public static void main(String[] args){ 
     final ArrayList<String> command = new ArrayList<String>(); 

     // CREATE FILES 
     File file = new File("File.txt"); 
     File newFile = new File("NewFile.txt");  
     try{ 
      if(!file.exists()) 
       file.createNewFile(); 
      if(!newFile.exists()) 
       newFile.createNewFile(); 
     } catch(Exception e){} 

     // force remove File.txt 
     command.add("rm"); 
     command.add("-f"); 
     command.add("File.txt"); 

     // rename NewFile.txt to File.txt 
     command.add("mv"); 
     command.add("NewFile.txt"); 
     command.add("File.txt"); 

     final ProcessBuilder builder = new ProcessBuilder(command); 
     try { 
      builder.start(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

回答

3

的问题是,你正在运行一个命令,即

rm -f File.txt mv NewFile.txt File.txt 

这种无条件删除名为File.txtmvNewFile.txt文件。

你想把它分成两个单独的命令。

更好的是,使用File.delete()File.renameTo()。这不仅会给你更多的控制权,还会让你的代码更加便携。

+0

谢谢。不幸的是,这回答了我的问题。我真正想要做的是:运行Program.jar,删除Program.jar,将NewProgram.jar重命名为Program.jar,运行Program.jar。因为我正在运行Program.jar(File.txt),所以它不能被删除。每个命令可以用一个ProcessBuilder解决吗? – Grains

0

ProcessBuilder.start创建一个进程。你需要调用它两次,因为你有两个命令:第一个是第一个命令,然后是第二个命令。

顺便说一下,为什么你不使用Java的文件API呢?从Java执行此操作比处理启动单独流程的复杂性要容易得多,更不用说效率更高了。