尝试在java中执行命令时出错[重复]

这个问题在这里已有答案:

我试图使用终端但是从java运行java文件 . 意思是,我将使用java运行命令 . 我正在尝试执行命令'cd / Users / apple / Documents / Documents / workspace / UserTesting / src'重定向到以下目录,然后执行命令'ls',列出当前目录中的所有文件

我正在使用此方法来运行Java文件'NewFile.java'

try {
           String line;
           Process p = Runtime.getRuntime().exec( "cd /Users/apple/Documents/Documents/workspace/UserTesting/src" );
           Process p2 = Runtime.getRuntime().exec( "ls" );

           BufferedReader in = new BufferedReader(
                   new InputStreamReader(p2.getInputStream()) );
           while ((line = in.readLine()) != null) {
             System.out.println(line);
           }
           in.close();

     }
     catch (Exception e) {
           // ...
         }

The output

直接使用终端 - >它给'NewFile.java'使用Java的这个方法 - >它总是给'bin'和'src'指定给p2的命令

这是几个试验

Apples-MacBook-Pro:〜apple $ cd / Users / apple / Documents / Documents / workspace / UserTesting / src Apples-MacBook-Pro:src apple $ java NewFile 5 90 35 45 150 3 Reichweite ---- nach blase art 3 5 35 45 90 150 Apples-MacBook-Pro:src apple $ java / Users / apple / Documents / Documents / workspace / UserTesting / src / NewFile线程“main”中的异常java.lang.NoClassDefFoundError:/ Users / apple / Documents / Documents / workspace / UserTesting / src / NewFile引起:java.lang.ClassNotFoundException:.Users.apple.Documents.Documents.workspace.UserTesting.src.NewFile at java.net.URLClassLoader $ 1.run(URLClassLoader.java:202) )at java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(URLClassLoader.java:190)at java.lang.ClassLoader.loadClass(ClassLoader.java:306)at sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:301)at java.lang.ClassLoader.loadClass(ClassLoader.java:247)Apples-MacBook-Pro:src apple $ java / Users / apple / Documents / Documents / workspace / UserTesting / src / NewFil e.java线程“main”中的异常java.lang.NoClassDefFoundError:/ Users / apple / Documents / Documents / workspace / UserTesting / src / NewFile / java引起:java.lang.ClassNotFoundException:.Users.apple.Documents.Documents Java.net.URLClassLoader.findClass(URLClassLoader.java)中java.security.AccessController.doPrivileged(Native Method)的java.net.URLClassLoader $ 1.run(URLClassLoader.java:202)中的.workspace.UserTesting.src.NewFile.java :190)at java.lang.ClassLoader.loadClass(ClassLoader.java:306)at sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:301)at java.lang.ClassLoader.loadClass(ClassLoader.java:247) Apples-MacBook-Pro:src apple $ Blockquote

回答(1)

2 years ago

因此,您遇到的问题似乎是您不明白为什么在以不同方式调用程序时会得到不同的结果 .

这里's what'正在进行: Runtime.geRuntime().exec() 创建一个新进程,它是父进程的子进程 . 每个进程都有自己的工作目录;当您分叉一个新进程时,它会继承父进程的工作目录 . 然后调用 cd 将更改当前进程的工作目录(这是一个内置的shell,但暂时忽略它,我稍后会介绍它) .

所以你正在做的是:

父 - >创建子1 - >更改子1的工作目录 - >创建子2 - >调用“ls”

请注意,子级2将继承其父级的工作目录 . 它不会知道子1的工作目录 . 因此,根据调用此方法的进程的工作目录(在您的情况下,终端或......我不知道,您的JDK安装? )你会得到不同的结果 .

如果你想每次都得到相同的结果,你可以这样做:

Process p = Runtime.getRuntime().exec( "ls /Users/apple/Documents/Documents/workspace/UserTesting/src" );

如果您希望能够从任何地方执行您的程序,只需使用完整路径:

Process p = Runtime.getRuntime().exec( "java /Users/apple/Documents/Documents/workspace/UserTesting/NewFile" );

(当然,假设您已经使用 javac 在该目录中构建 NewFile.class ,并且您具有执行它的权限 . )

Re: cd ,正如我之前提到的,这是一个内置在shell中的命令 . 当您以这种方式使用 exec 调用命令时,它可能会失败 . 您可以使用 ProcessgetErrorStream() 方法读取标准错误来检查 .