我正在尝试使用终端但从 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
这里有几个尝试
苹果-MacBook-Pro:~苹果$光盘
/用户/苹果/文档/文档/工作空间/UserTesting/src苹果-MacBook-Pro:src apple$java 新建文件5 90 35 45 150 3
Reichweite----nach blase art
3 5 35 45 90 150
苹果-MacBook-Pro:src apple$java /用户/苹果/文档/文档/工作空间/UserTesting/src/NewFile线程“main”java.lang.NoClassDefFoundError 中出现异常:
/用户/苹果/文档/文档/工作空间/UserTesting/src/NewFile
引起原因:java.lang.ClassNotFoundException:
.Users.apple.Documents.Documents.workspace.UserTesting.src.NewFile 位于
java.net.URLClassLoader$1.run(URLClassLoader.java:202) 在
java.security.AccessController.doPrivileged(本机方法)位于
java.net.URLClassLoader.findClass(URLClassLoader.java:190) 在
java.lang.ClassLoader.loadClass(ClassLoader.java:306) at
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 在
java.lang.ClassLoader.loadClass(ClassLoader.java:247)
苹果-MacBook-Pro:src apple$java /Users/apple/Documents/Documents/workspace/用户测试/src/New File.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) 处
java.security.AccessController.doPrivileged(本机方法)位于
java.net.URLClassLoader.findClass(URLClassLoader.java:190) 在
java.lang.ClassLoader.loadClass(ClassLoader.java:306) at
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 在
java.lang.ClassLoader.loadClass(ClassLoader.java:247)
苹果-MacBook-Pro:src apple$
块引用
因此,您遇到的问题似乎是您不明白为什么当您以不同方式调用程序时会得到不同的结果。
这是发生的事情:Runtime.geRuntime().exec()
创建一个新进程,它是父进程的子进程。每个进程都有自己的工作目录;当您派生一个新进程时,它会继承父进程的工作目录。调用cd
然后将更改当前进程的工作目录(这是一个内置的 shell,但现在忽略它,我稍后会介绍它)。
所以你正在做的是这样的:
Parent
-> 创建子进程 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
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)