系统找不到指定java的文件

时间:2015-03-18 02:13:58

标签: java cmd java-io

是的,我已经知道这个问题是重复的,但请耐心等待。没有其他问题回答过这个问题。

这是我的代码:

package pc.setup;

import java.io.IOException;

public class DirectoryCreator {
    public static void setupDirectories() throws IOException {
        Runtime.getRuntime().exec("cd\\");
    }
}

这是我得到的错误:

Exception in thread "main" java.io.IOException: Cannot run program "cd\": CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessBuilder.start(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at pc.setup.DirectoryCreator.setupDirectories(DirectoryCreator.java:7)
    at pc.load.PieClickerRunner.main(PieClickerRunner.java:9)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(Unknown Source)
    at java.lang.ProcessImpl.start(Unknown Source)
    ... 6 more

3 个答案:

答案 0 :(得分:3)

这里有两个问题:

  • cd本身不是可执行文件;它是命令shell的内置命令。 exec仅运行可执行文件(在自己的文件中)。这就是为什么没找到它。 exec可以运行命令shell,但是......
  • 即使您在命令shell中更改了目录,该更改仅对新生成的进程有效,而不是对启动它的程序有效。

很抱歉,但这种方法在Java中不起作用。

答案 1 :(得分:1)

我假设您在Windows操作系统系列下运行此应用程序(否则您将不得不对其进行一些调整)。 Runtime.exec()方法用于执行可执行命令。 dir, cd, copy,并非如此......因此,它会触发您遇到的异常。

cd命令是windows命令解释器cmd.的一部分。它可以使用command.comcmd.exe执行,具体取决于操作系统的版本。

因此我们应首先运行命令解释器并将其提供给用户提供的命令(例如dir, cd, copy, ...)

这是一个执行此操作的程序。它检查os.name环境变量以选择正确的命令解释器。我测试Windows NT和Windows 95.如果找不到这两个,但仍然是Windows操作系统,那么我认为它是一个现代的Windows(如Windows 7或Windows 8),它正在使用cmd.exe.

import java.util.*;
import java.io.*;
class StreamGobbler extends Thread
{
    InputStream is;
    String type;

    StreamGobbler(InputStream is, String type)
    {
        this.is = is;
        this.type = type;
    }

    public void run()
    {
        try
        {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line=null;
            while ( (line = br.readLine()) != null)
                System.out.println(type + ">" + line);    
         } catch (IOException ioe)
         {
            ioe.printStackTrace();  
         }
    }
}
public class GoodWindowsExec
{
    public static void main(String args[])
    {
        if (args.length < 1)
        {
            System.out.println("USAGE: java GoodWindowsExec <cmd>");
            System.exit(1);
        }

        try
        {            
            String osName = System.getProperty("os.name" );
            System.out.println("OS NAME IS " + osName);
            String[] cmd = new String[3];
            if( osName.equals( "Windows NT" ) )
            {
                cmd[0] = "cmd.exe" ;
                cmd[1] = "/C" ;
                cmd[2] = args[0];
            }
            else if( osName.equals( "Windows 95" ) )
            {
                cmd[0] = "command.com" ;
                cmd[1] = "/C" ;
                cmd[2] = args[0];
            } else if (osName.toUpperCase().trim().contains("WINDOWS")) {
                cmd[0] = "cmd.exe" ;
                cmd[1] = "/C" ;
                cmd[2] = args[0];
            }

            Runtime rt = Runtime.getRuntime();
            System.out.println("Execing " + cmd[0] + " " + cmd[1] 
                           + " " + cmd[2]);
            Process proc = rt.exec(cmd);
            // any error message?
            StreamGobbler errorGobbler = new 
                StreamGobbler(proc.getErrorStream(), "ERROR");            

            // any output?
            StreamGobbler outputGobbler = new 
                StreamGobbler(proc.getInputStream(), "OUTPUT");

            // kick them off
            errorGobbler.start();
            outputGobbler.start();

            // any error???
            int exitVal = proc.waitFor();
            System.out.println("ExitValue: " + exitVal);        
        } catch (Throwable t)
          {
            t.printStackTrace();
          }
    }
}

这是这个班级的简单跑步者

public class GoodWindowsExecRunner {

    public static void main(String[] args) {
        //GoodWindowsExec.main(new String[] {"dir *.*"});
        GoodWindowsExec.main(new String[] {"cd .."});
    }

}

这是执行“cd ..”命令

的结果

cd command

以下是执行“dir ”命令

的结果

enter image description here

有一篇关于java世界的优秀文章叫When Runtime.exec won't

答案 2 :(得分:0)

谢谢大家的回答。但是他们很啰嗦,所以在这个答案中我会试着总结一下。

当您致电Runtime.getRuntime.exec()时,您必须指定您正在使用的shell(仅限Windows)。所以,你会说Runtime.getRuntime.exec("command here", "cmd.exe")。您可能知道,CMD是适用于现代Windows操作系统的Windows命令外壳。

再次感谢您的回答。