尝试在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) { // ... } 

输出

直接使用终端 – >它给’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线程中的exception“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。位于java..L.Tisc.Launcher的java.lang.ClassLoader.loadClass(ClassLoader.java :)的java.net.URLClassLoader.findClass(URLClassLoader.java:190)上的AccessController.doPrivileged(Native Method)$ 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/NewFile.java线程“main”中的exceptionjava.lang.NoClassDefFoundError:/ Users / apple / Documents / Documents / workspace / UserTesting / src / NewFile / java引起:java.lang.ClassNotFoundException:.Users.apple.Documents.Documents.workspace.UserTesting.src.NewFile.java 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 $ java.lang.ClassLoader.loadClass上的AppClassLoader.loadClass(Launcher.java:301)(ClassLoader.java:247)Apples-MacBook-Pro:src apple $ Blockquote

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

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

所以你正在做的是:

– >创建子1 – >更改子1的工作目录

– >创建子2 – >调用“ls”

请注意,子级2将inheritance其父级的工作目录。 它不会知道子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()方法读取标准错误来检查。