Java 运行时问题
如何在windows上执行此操作,未创建文件filename.txtJava 运行时问题,java,runtime.exec,Java,Runtime.exec,如何在windows上执行此操作,未创建文件filename.txt Process p = Runtime.getRuntime().exec("cmd echo name > filename.txt"); 显然,预期的输出是一个“filename.txt”,应该创建内容为“name”的“C:\Documents and Settings\username\filename.txt” 即使没有使用processBuilder创建文件名为“filename.txt”,也可以使用以下代
Process p = Runtime.getRuntime().exec("cmd echo name > filename.txt");
显然,预期的输出是一个“filename.txt”,应该创建内容为“name”的“C:\Documents and Settings\username\filename.txt”
即使没有使用processBuilder创建文件名为“filename.txt”,也可以使用以下代码进行管理
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("cmd /c cleartool lsview");
// Directly to file
//Process p = Runtime.getRuntime().exec(
// new String[] { "cmd", "/c", "cleartool lsview > filename.txt" },null, new File("C:/Documents and Settings/username/"));
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
System.out.printf("Output of running %s is:",
Arrays.toString(args));
while ((line = br.readLine()) != null) {
System.out.println(line);
}
或者,使用ProceeSBuilder
Process process = new ProcessBuilder( "cmd", "/c", "cleartool lsview" ).start();
InputStream is = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
System.out.printf("Output of running %s is:", Arrays.toString(args));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
它应该与
Process p = Runtime.getRuntime().exec(
new String[] { "cmd", "/c", "echo name > filename.txt" });
我目前没有运行Windows,所以很遗憾我无法测试它
这背后的原因是,在您的版本中,命令在每个空格字符处被拆分。因此,运行时所做的是创建一个进程cmd
,并向它提供参数echo
、name
、
和filename.txt
,这些参数毫无意义。命令echo name>filename.txt
是cmd
进程的一个参数,因此您必须手动提供一个包含不同参数的数组
如果要确保文件是在特定文件夹中创建的,则必须为exec()
提供一个工作目录,该目录仅适用于三参数版本:
Process p = Runtime.getRuntime().exec(
new String[] { "cmd", "/c", "echo name > filename.txt" },
null, new File("C:/Documents and Settings/username/"));
实际上应该使用而不是
Runtime.exec
(请参阅)
(如果我有一台windows机器,我会将它改编成cmd和echo…请随意编辑这篇文章!)它现在怎么不工作?以什么方式不工作?很明显?你是直接从'C:\Documents and Settings\username'文件夹运行它吗?你为什么要用cmd来运行它?你不能用
java.io.File
?你正在执行的命令会在我的机器上打开一个命令窗口。你是说cmd/k echo name>filename.txt
?但这是一个依赖于平台的问题:)是的,波佐。我真的没有得到那个评论。如果你执行某件事情,它(几乎?)总是依赖于平台。这行得通吗?我认为Runtime.exec
无法在echo name>filename.txt
@tim中处理重定向,这就是为什么它是处理重定向的cmd
的一个参数。不是exec()
。请记住,ProcessBuilder
是在JDK5中引入的。早期版本的JDK仍然需要Runtime.exec(…)
。无论您使用ProcessBuilder
还是exec()
,问题的根源(传递在错误位置拆分的单个字符串)都是一样的。我实际需要的是“cmd cleartool lsview>views.txt”,命令cleartool lsview的execpect输出应转到views.txt文件。这在正常cmd提示符下工作正常。但在java程序中,我确实希望实现this@musiKk; 你说得对。我可以澄清一下,您的_命令
可能对应于cmd
,而arg1
对应于echo name
。但是,我没有一台windows机器可以测试这一点。(这就是为什么我说每个人都可以自由编辑帖子。)@srinanapa,try-to-donewprocessbuilder(“cleartool”,“lsview”)代码>在上述解决方案中。
ProcessBuilder pb = new ProcessBuilder("your_command", "arg1", "arg2");
pb.directory(new File("C:/Documents and Settings/username/"));
OutputStream out = new FileOutputStream("filename.txt");
InputStream in = pb.start().getInputStream();
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0)
out.write(buf, 0, len);
out.close();