【问题标题】:ProcessBuilder delete and renameProcessBuilder 删除和重命名
【发布时间】:2013-06-27 05:57:13
【问题描述】:

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

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

【问题讨论】:

    标签: java macos command processbuilder


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      问题是您正在运行单个命令,即

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

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

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

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

      【讨论】:

      • 谢谢。不幸的是,这回答了我的问题。我真正想做的是:运行 Program.jar,删除 Program.jar,将 NewProgram.jar 重命名为 Program.jar,运行 Program.jar。因为我正在运行 Program.jar(File.txt) 它不能被删除。是否可以为每个命令使用一个 ProcessBuilder 来解决?
      猜你喜欢
      • 1970-01-01
      • 2015-03-09
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      相关资源
      最近更新 更多