Java 使用cmd打开包含多个空格的文件时出现问题

Java 使用cmd打开包含多个空格的文件时出现问题,java,windows,cmd,Java,Windows,Cmd,我使用java调用下面的命令 这是java初始化 String fileName="C:\\temp\\A a.txt"; String sCmd = "cmd /c start \"\" \"" + fileName + "\""; 这是我打印sCmd时得到的 cmd /c start '" 'C:\temp\A a.txt' 这就是我运行命令的方式 Runtime.getRuntime().exec(sCmd); 文件名包含多个空格,当我从Java运行此命令时,它会抛出一个

我使用java调用下面的命令

这是java初始化

String fileName="C:\\temp\\A  a.txt";
String  sCmd = "cmd /c start \"\" \"" + fileName + "\"";
这是我打印sCmd时得到的

 cmd /c start '" 'C:\temp\A   a.txt'
这就是我运行命令的方式

 Runtime.getRuntime().exec(sCmd);
文件名包含多个空格,当我从Java运行此命令时,它会抛出一个错误,因为它无法识别多个空格。它在没有空格或只有一个空格的情况下工作?如何通过windows命令处理具有多个空格的文件

示例java程序

   import java.io.File;
import java.io.IOException;

public class A
{
    public static void main(String[] args)
    {
        String fileName = "C:\\temp\\a  dfdfd   f.txt";
        File file = new File(fileName);
        String sCmd = "cmd /c start \"\" \"" + file.getAbsolutePath() + "\"";

        System.out.println("exec cmd=<" + sCmd + ">");
        try
        {
            Runtime.getRuntime().exec(sCmd);
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
导入java.io.File;
导入java.io.IOException;
公共A类
{
公共静态void main(字符串[]args)
{
String fileName=“C:\\temp\\a dfd f.txt”;
文件=新文件(文件名);
字符串sCmd=“cmd/c start\\”+file.getAbsolutePath()+“\”;
System.out.println(“exec cmd=”);
尝试
{
Runtime.getRuntime().exec(sCmd);
}
捕获(IOE异常)
{
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
当我从windows端运行java代码时,这会导致错误

这是java输出

exec cmd=<cmd /c start "" "C:\temp\a  dfdfd   f.txt">
执行命令= 我在Windows XP中运行,这并没有打开任何文件,只留下一个带有空格的文件

解决方案:

import java.io.File;
import java.io.IOException;

public class A
{
    public static void main(String[] args)
    {
        // String fileName = "C:\\temp\\a.txt";
        String fileName = "C:\\temp\\a  dfdfd   f.txt";
        File file = new File(fileName);
        String sCmd = "cmd /c start \"\" \"" + file.getAbsolutePath() + "\"";

        System.out.println("exec cmd=<" + sCmd + ">");
        try
        {
            Runtime.getRuntime().exec(sCmd.split(" "));
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
导入java.io.File;
导入java.io.IOException;
公共A类
{
公共静态void main(字符串[]args)
{
//字符串fileName=“C:\\temp\\a.txt”;
String fileName=“C:\\temp\\a dfd f.txt”;
文件=新文件(文件名);
字符串sCmd=“cmd/c start\\”+file.getAbsolutePath()+“\”;
System.out.println(“exec cmd=”);
尝试
{
Runtime.getRuntime().exec(sCmd.split(“”);
}
捕获(IOE异常)
{
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
cmd/c start“c:\temp\A A.txt”
可从命令行运行。
如果通过Java的
Runtime.getRuntime().exec(…)
调用此命令,则需要用反斜杠对上述命令中的双引号进行转义。我不太清楚您在做什么,但如果它只是
cmd/c start
那么它就有太多引号

String  sCmd = "cmd /c start \"\" \"" + fileName + "\"";
应该是

String  sCmd = "cmd /c start \"" + fileName + "\"";

旁白:

这是我打印sCmd时得到的

 cmd /c start '" 'C:\temp\A   a.txt'

我不明白当字符串中没有单引号时,如何在输出中获得单引号

感谢添加java代码的注释这是一个已知的错误,请尝试此答案。它在所有情况下都非常有效,当我运行命令cmd/c start“c:\temp\a a.txt”时,它会打开命令提示符,从技术上讲,它应该会打开文件。然后我猜您正在寻找cmd/c记事本“c:\temp\a.txt”(在记事本中打开它;您也可以使用其他应用程序)现在从命令提示符运行是问题所在。上述独立代码的主要问题。如果您运行它,我会得到一个windows错误。我猜正如您所说的,错误是“处理,但我不确定错误在哪里。你看到了吗?我终于找到了解决方案:如果将来有人引用此代码,他们可能会使用上面的代码