以下代码为什么不起作用?

时间:2015-12-15 16:07:52

标签: java linux command

我试图通过java在linux中运行shell命令。大多数命令都有效,但是当我运行以下命令时,我得到了一个execption,虽然它在shell中有效:

    String command = "cat b.jpg f1.zip > pic2.jpg";

    String s = null;
    try {
        Process p = Runtime.getRuntime().exec(command);

        BufferedReader stdInput = new BufferedReader(new
             InputStreamReader(p.getInputStream()));

        BufferedReader stdError = new BufferedReader(new
             InputStreamReader(p.getErrorStream()));

        System.out.println("Here is the standard output of the command:\n");

        while ((s = stdInput.readLine()) != null) {
            System.out.println(s);
        }
        System.out.println("Here is the standard error of the command (if any):\n");
        while ((s = stdError.readLine()) != null) {
            System.out.println(s);
        }
        System.exit(0);
    }
    catch (IOException e) {
        System.out.println("exception happened - here's what I know: ");
        e.printStackTrace();
        System.exit(-1);
    }

我在控制台中收到错误:

cat:>:没有这样的文件或目录

cat:pic2.jpg:没有这样的文件或目录

3 个答案:

答案 0 :(得分:2)

问题是重定向。

  

cat:>:没有这样的文件或目录

解释此错误消息的方法:

  • 程序cat试图告诉您有关问题的信息
  • 问题是没有名为>
  • 的文件

确实,>不是文件。根本不打算作为文件。它是一个重定向输出的shell操作符。

您需要使用ProcessBuilder重定向:

ProcessBuilder builder = new ProcessBuilder("cat", "b.jpg", "f1.zip");
builder.redirectOutput(new File("pic2.jpg"));
Process p = builder.start();

答案 1 :(得分:1)

因为你需要启动一个shell(例如/ bin / bash)来执行你的shell命令,所以替换:

String command = "cat b.jpg f1.zip > pic2.jpg";

String command = "bash -c 'cat b.jpg f1.zip > pic2.jpg'";

答案 2 :(得分:1)

当你运行一个命令时,它不会像bash那样启动一个shell,除非你明确地这样做。这意味着您正在运行cat,其中包含四个参数b.jpg f1.zip > pic2.jpg最后两个文件名称不存在,因此您会收到错误消息。

您可能想要的是以下内容。

String command = "sh -c 'cat b.jpg f1.zip > pic2.jpg'";

这将运行sh,它将>视为重定向输出的特殊字符。