【问题标题】:main(String[] args) different of String[] args = {.....}?main(String[] args) 与 String[] args = {.....} 不同?
【发布时间】:2014-01-30 13:06:34
【问题描述】:

好的,我们开始: 当我通过静态 main 传递参数时,我的程序运行良好。但是当我通过在 main 中声明的相同“参数”时,它不起作用。如果听起来很困惑,这里是代码。我想要做的就是通过 main 不带 args 来做这些事情。 这是调试:http://i.stack.imgur.com/sbGyo.png

import java.io.*;
import java.util.*;

public class DoProcessBuilder extends Thread {
  public static void main (String[] args) throws IOException, InterruptedException {
    DoProcessBuilder teste = new DoProcessBuilder();

    String[] uia = {"ls","-al","|","grep","bash"};
    teste.ExecCommand(uia);    // here this not works, WHY? if I execute the "java DoProcessBuilder ls -al | grep bash" works fine?

    teste.ExecCommand(args); // works fine!

  }

  public  String ExecCommand(String args[]) throws IOException, InterruptedException {
    StringBuffer x = new StringBuffer();
    if (args.length <= 0) {
        System.err.println("Need command to run");
    }

    Process process = new ProcessBuilder(args).start();
    process.waitFor();
    InputStream is = process.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    String line = "";

    while((line = br.readLine()) != null){
        x.append(line+"\n");
    }
    System.out.println("\nCOMMAND OUT \n"+x.toString());

    return x.toString();

  }
}

【问题讨论】:

  • 请告诉我们您的堆栈跟踪“不起作用”对我们没有帮助
  • 它应该可以工作。就像 Philipp 说的,请发布堆栈跟踪。
  • 打印两个数组并检查它们是否相等
  • 根据给定的信息,我只能说uiaargs 不包含完全相同的字符串。使用断点来验证这一点。
  • 这是一个练习还是你真的想使用它?使用外部命令不是java的做事方式!几乎从来没有调用外部命令的冲动。对于给定的任务,您可以使用 File#listFiles() 并过滤接收到的文件列表。

标签: java main args


【解决方案1】:

您正在尝试使用 ProcessBuilder 执行 shell 管道。那是行不通的。管道| 不是ls 命令的有效参数。您必须启动一个 shell new ProcessBUilder("sh")

而且它与 args 一起工作得很好,因为你的程序没有从调用 shell 中获取管道和其余部分。你的程序只会得到ls -al

【讨论】:

  • 使用 args ls -al | 执行这个程序...它的工作原理
  • 如果你在 shell 中执行java DoProcessBuilder ls -al | grep bash,你永远不会得到|grepbash进入你的程序。
  • 彼得,你试过执行这个程序吗?完全按原样编译这些程序。转到您的命令/shell 并执行 java DoProcessBuilder ls -al | grep 的东西。它有效!
  • 当然你会得到一些输出,但是这个输出是从你的程序中获取的文件列表(ls -al),然后你的程序标准输出管道从 shell 进入 grep,你在其中发出命令这个例子。您的程序根本没有调用grep。做一个System.out.println(Arrays.toString(args)),你会看到。结束了。
  • 你说得对,彼得。我应该像你提到的那样做 ProcessBuilder 。 TNX!
【解决方案2】:

没有问题,你提到的地方。但是使用teste.ExecCommand(args); 你会得到ArrayIndexOutOfBoundsException

   StringBuffer x = new StringBuffer();
    if (args.length <= 0) {
        System.err.println("Need command to run");
    }

    Process process = new ProcessBuilder(args).start(); // ArrayIndexOutOfBoundsException
    process.waitFor();
    InputStream is = process.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    String line = "";

    while((line = br.readLine()) != null){
        x.append(line+"\n");
    }
    System.out.println("\nCOMMAND OUT \n"+x.toString());

    return x.toString();

【讨论】:

  • 我知道,如果你在没有参数的情况下执行,它会那样做。像我提到的那样使用 args 执行此操作。
猜你喜欢
  • 2011-08-25
  • 1970-01-01
  • 2014-04-03
  • 2010-09-23
  • 2012-10-21
  • 2014-02-22
  • 1970-01-01
  • 2016-05-22
  • 2013-06-03
相关资源
最近更新 更多