【问题标题】:Outputting result of "dir" to console in Java在Java中将“dir”的结果输出到控制台
【发布时间】:2011-04-25 22:14:02
【问题描述】:

我想将“dir”命令的结果输出到 java 控制台。我已经在 Google 和这里​​查看过,但没有一个示例适合我,因此让我写这篇文章。

我的代码如下:

try
    {
        System.out.println("Thread started..");
        String line = "";
        String cmd = "dir";

        Process child = Runtime.getRuntime().exec(cmd);

        //Read output
        BufferedReader dis = new BufferedReader( new InputStreamReader(child.getInputStream() ));

        while ((line = dis.readLine()) != null)
        {
            System.out.println("Line: " + line);
        }

        dis.close();

    }catch (IOException e){

    }

我做错了什么?

任何帮助都会非常好。

提前致谢,

达里尔

【问题讨论】:

    标签: java redirect dir ls


    【解决方案1】:
    1. 您不能将“dir”作为进程运行,您需要将其更改为String cmd = "cmd dir";
    2. 您根本不处理异常。在 catch 块中添加行 e.printStackTrace()); 会告诉你我在 (1) 中写的内容。 永远不要忽略异常!
    3. 您不处理错误流。这可能会导致您的程序挂起、处理错误流并使用不同的流并行读取两个流(错误和输入)。

    【讨论】:

    • 非常感谢。这基本上解决了我的问题。经验教训..关于(3),我如何处理错误流?使用 try/catch 或 ?
    • 另见ls -R的Java实现
    • @Dar56 - 您几乎可以像获得输入流一样获得错误流 - child.getErrorStream()
    • @MByD 你建议System.out.println(e.toString())而不是e.printStackTrace()有什么特别的原因吗?当然,这比忽略异常要好,但实际上没有充分的理由隐藏堆栈跟踪。
    • @MByD 谢谢。你碰到了我的一个小毛病。 :)
    【解决方案2】:

    最好的办法是使用commons exec http://commons.apache.org/exec/

    这有一些东西可以捕捉到真正让你陷入困境的怪癖,比如如果你没有清除它的输出流,整个进程就会阻塞,在命令中转义引号等等。

    这是一个可以在 windows 中成功运行 del 命令的方法。请注意 cmd 的使用,因为 del 不是独立的可执行文件:

    private void deleteWithCmd(File toDelete) throws IOException {
        CommandLine cmdLine = new CommandLine("cmd.exe");
        cmdLine.addArgument("/C");
        cmdLine.addArgument("del");
        cmdLine.addArgument(toDelete.getAbsolutePath());
        DefaultExecutor executor = new DefaultExecutor();
        int exitValue = executor.execute(cmdLine);
    }
    

    【讨论】:

      【解决方案3】:
      • a) 什么是 java 控制台?
      • b) 您应该使用 javas File.listFiles () 而不是 Runtime.exec,后者不可移植,并且使得名称拆分成为必要 - 对于包含空格、空格、换行符等的文件名来说,这是一件困难的事情。
      • c) 你的代码有什么问题?
      • d) 为什么在异常情况下不做任何事情?

      【讨论】:

        【解决方案4】:

        这是一个更详尽的示例,说明了操作系统版本和错误情况(如上述 MByD 所述)

        http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4

        请记住,使用“exec”意味着您的应用程序不再是跨平台的,并且失去了 Java 的主要优势之一。

        更好的方法是使用 java.io 包。

        http://download.oracle.com/javase/tutorial/essential/io/dirs.html

        【讨论】:

        • 这是否意味着如果我的 cmd = "ping www.google.com" 也不会是跨平台的?还是仅仅因为“dir”命令?
        • 是的。我专门回答了您在示例中使用“dir”的事实。但总的来说,“exec”正在机器上运行一个进程。这意味着您传递给它的命令取决于机器。
        • 好的,非常感谢。我还有一个问题。我已成功使用此代码获取 ping 和 dir-results,但是当我尝试从 arpspoof 获取屏幕输出时,它并没有给我任何回报。这是有原因的吗?
        【解决方案5】:

        你也可以在 java 6 中做类似的事情:

        import java.io.File;
        import java.io.FilenameFilter;
        import java.io.IOException;
        
        public class ListFilesFromRegExp {
        
            public static void main(String[] args) throws IOException {
                File dir = new File("files/");
                File[] files = dir.listFiles(new FilenameFilter() {
                    public boolean accept(File dir, String name) {
                        return name.matches("File[0-9].c");
                    }
                });
                for (int i = 0; i < files.length; i++) {
                    System.out.println(files[i].getAbsolutePath());
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-01
          • 1970-01-01
          • 2014-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-24
          相关资源
          最近更新 更多