-1

我正在尝试使用终端但从 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 使用此方法 -> 对于给p2的任何命令,它总是给出 'bin' 和 'src'

这里有几个试验

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) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:247)

Apples-MacBook-Pro:src apple$ java /Users/apple/Documents/Documents/workspace/UserTesting/src/NewFile.java 线程“main”中的异常 java.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 ) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:190) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:306) 在 sun.misc.Launcher$ AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) Apples-MacBook-Pro:src apple$ Blockquote

4

1 回答 1

1

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

这是发生了什么: Runtime.geRuntime().exec()创建一个新进程,它是父进程的子进程。每个进程都有自己的工作目录;当你 fork 一个新进程时,它会继承父进程的工作目录。然后调用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以这种方式调用命令时,它可能会失败。您可以通过使用 的getErrorStream()方法读取标准错误来检查这一点Process

于 2013-06-16T16:05:37.373 回答