尝试在java中执行命令时出错

时间:2013-06-16 15:52:40

标签: java terminal runtime execution

我正在尝试使用终端但是从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   /用户/苹果/文档/文档/工作区/ UserTesting / SRC   苹果-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中的异常:   /用户/苹果/文档/文档/工作区/ 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 at   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中的异常:   /用户/苹果/文档/文档/工作区/ UserTesting / SRC / NEWFILE / JAVA   引起:java.lang.ClassNotFoundException:   .Users.apple.Documents.Documents.workspace.UserTesting.src.NewFile.java     在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 at   java.lang.ClassLoader.loadClass(ClassLoader.java:247)   苹果-MacBook-Pro:src apple $   块引用

1 个答案:

答案 0 :(得分:1)

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

以下是正在发生的事情: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调用命令时,它可能会失败。您可以使用getErrorStream()的{​​{1}}方法读取标准错误来检查。