【问题标题】:Runtime exec() doesn't run commands when filename has spaces [duplicate]当文件名有空格时,运行时 exec() 不运行命令 [重复]
【发布时间】:2014-05-14 16:21:11
【问题描述】:

我是 Java 新手,并试图将我的一个项目从 C 转换为 Java,以便将它与另一个 Java 程序结合起来。当我使用 Runtime.exec() 时,我很难得到正确的结果。我有以下程序段,Java 忽略处理给定的命令。

command1 = "mv output/tsk/dir1/metabolic\\ waste.txt output/converted/file16.txt";                                               
r2 = Runtime.getRuntime();
p2 = r2.exec(command1);
p2.waitFor();

这里的问题是文件名“metabolic waste.txt”。当没有空间时,相同的命令起作用。我知道我必须使用 escape char 作为空间,我这样做了。顺便说一句,我正在开发 Ubuntu。

我也尝试过使用

String[] command1 = new String[] {"mv output/tsk/dir1/metabolic\ waste.txt", "output/converted/file16.txt";

但是没有用。

附言给定的代码只是一个例子。我不仅使用 linux mv 命令。我还运行一些命令行工具,例如 pdf2txt。如果文件名中有空格,我仍然会遇到同样的运行命令问题。

已解决:我已经解决了我的问题。我不得不删除转义字符并使用字符串数组,这很荒谬。因此,没有 ESCAPE CHARACTER 空间。以下代码仅适用于此示例和更一般的情况。

source_filepath = "output/tsk/dir1/metabolic waste.txt";
dest_filepath = "output/converted/file16.txt";
String[] str2= {"mv", source_filepath, dest_filepath};
r2 = Runtime.getRuntime().exec(str2);
p2.waitFor();

【问题讨论】:

  • Java 有它自己的 portable 方法:docs.oracle.com/javase/tutorial/essential/io/move.html
  • 是刚刚没有工作但仍然执行命令,还是没有编译?
  • 不要使用Runtime.exec(),使用ProcessBuilder
  • @clcto 我不仅需要 mv 命令。但是很高兴知道 Java 的内部方式。谢谢。
  • @DirkyJerky 没有编译错误,但我认为它不会执行我的命令。

标签: java runtime.exec


【解决方案1】:

你必须逃避转义,或者用引号将路径括起来:

String[] command1 = new String[] {"mv output/tsk/dir1/metabolic\\ waste.txt", "output/converted/file16.txt"};
String[] command1 = new String[] {"mv \"output/tsk/dir1/metabolic waste.txt\"", "output/converted/file16.txt"};

你必须使用\\,因为java也使用\作为转义字符,所以"\\"实际上只包含一个\

【讨论】:

  • 抱歉,打错字了。每当我在文件名中找到“”时,我都会使用“\\”。
  • 没有引号的第二行工作正常。不需要转义字符。再次感谢。
  • 如果命令是动态生成的呢?我无法知道这些空间的确切位置。
【解决方案2】:

您可以将文件名用双引号括起来,如下所示:

  String srcFile = "output/tsk/dir1/metabolic\\ waste.txt"
  command1 = "mv " + srcFile +" output/converted/file16.txt";                     

【讨论】:

  • 我能问你为什么不使用 FIle API 来完成这项任务吗?
  • @Karakot 这只是我的错误的一个例子。如上所述,我可以使用更简单的技术,但实际上我会运行一些命令行工具。我只是举了一个简单的例子来说明我的问题。例如,我在运行以下命令时遇到了同样的问题:filePath = "file\\ name\\ has\\ space.docx"; command1 = "docx2txt.sh" + 文件路径; r2 = Runtime.getRuntime(); p2 = r2.exec(command1); p2.waitFor();
  • 所以这个输出文件夹在你运行这段代码的文件夹里面?
  • 是的。文件路径没有问题。我已经在终端上测试了 command1 它工作得很好。从我的 Java 代码传递它时它不起作用。
  • 我也试过了:我收到以下错误 mv: target `output/converted/file16.txt' is not a directory
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多