这有点令人费解。以下批处理片段导致复制这两个文件:
xcopy "C:\Source\Spaces1 [ ].txt" "C:\Target\" /Y
xcopy "C:\Source\Spaces2 [ ].txt" "C:\Target\" /Y
以下使用流的Java代码段也会导致复制这两个文件:
public static void main(final String args[]) throws IOException
{
final File source1 = new File("C:\\Source", "Spaces1 [ ].txt");
final File target1 = new File("C:\\Target", "Spaces1 [ ].txt");
fileCopy(source1, target1);
final File source2 = new File("C:\\Source", "Spaces2 [ ].txt");
final File target2 = new File("C:\\Target", "Spaces2 [ ].txt");
fileCopy(source2, target2);
}
public static void fileCopy(final File source, final File target) throws IOException
{
try (InputStream in = new BufferedInputStream(new FileInputStream(source));
OutputStream out = new BufferedOutputStream(new FileOutputStream(target));)
{
final byte[] buf = new byte[4096];
int len;
while (0 < (len = in.read(buf)))
{
out.write(buf, 0, len);
}
out.flush();
}
}
但是,在此片段中,未复制其中一个文件(跳过具有双倍空格的文件):
public static void main(final String args[]) throws Exception
{
final Runtime rt = Runtime.getRuntime();
rt.exec("xcopy \"C:\\Source\\Spaces1 [ ].txt\" \"C:\\Target\\\" /Y").waitFor();
// This file name has two spaces in a row, and is NOT actually copied
rt.exec("xcopy \"C:\\Source\\Spaces2 [ ].txt\" \"C:\\Target\\\" /Y").waitFor();
}
这笔交易是什么?这将用于从谁知道什么来源复制文件,人们可以在其中键入他们喜欢的任何内容。文件名被清理,但谁连续两个空格清理?我在这里缺少什么?
目前使用Java 8,但Java 6和7给出了相同的结果。
答案 0 :(得分:1)
这一切都在Javadoc中。
Runtime#exec(String)
代表Runtime#exec(String,null,null)
exec(String,null,null)
代表exec(String[] cmdarray,envp,dir)
然后
更准确地说,命令字符串使用由调用new StringTokenizer(命令)创建的StringTokenizer分解为标记,而不进一步修改字符类别。然后,由tokenizer生成的标记以相同的顺序放置在新的字符串数组cmdarray中。
此时两个空格丢失,并在操作系统重新组装命令字符串时成为一个空格。