栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

具有输入/输出流的Java流程

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

具有输入/输出流的Java流程

首先,我建议更换生产线

Process process = Runtime.getRuntime ().exec ("/bin/bash");

与线

ProcessBuilder builder = new ProcessBuilder("/bin/bash");builder.redirectErrorStream(true);Process process = builder.start();

ProcessBuilder是Java 5中的新增功能,它使运行外部进程更加容易。在我看来,它最大的改进

Runtime.getRuntime().exec()
是它允许你将子进程的标准错误重定向到其标准输出中。这意味着你只有一个人
InputStream
可以阅读。在此之前,你需要有两个单独的线程,一个从中stdout读取,另一个从中读取
stderr
,以避免在标准输出缓冲区为空(导致子进程挂起)时填充标准错误缓冲区,反之亦然。

接下来,循环(其中有两个循环)

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

仅当reader从流程的标准输出读取的,返回文件末尾时退出。这仅在bash进程退出时发生。如果当前碰巧不再有该过程的输出,它将不会返回文件结尾。相反,它将等待流程的下一行输出,直到有下一行才返回。

由于你要在到达此循环之前向流程发送两行输入,因此,如果在这两行输入之后流程尚未退出,则这两个循环中的第一个将挂起。它会坐在那里等待另一行被读取,但是永远不会再有另一行可以读取。

我编译了你的源代码(目前我在Windows上,所以我将其替换/bin/bash为cmd.exe,但是原理应该相同),我发现:

  • 在两行输入后,出现前两个命令的输出,但是程序挂起,
  • 如果我输入,
    echo test
    然后输入
    exit
    ,则该程序将退出第一个循环,因为该
    cmd.exe
    进程已退出。然后,程序要求输入另一行(将被忽略),由于子进程已经退出,因此直接跳过了第二个循环,然后退出自身。
  • 如果我输入,
    exit
    然后输入,则会
    echo test
    收到
    IOException
    ,抱怨管道被关闭。这是可以预期的-输入的第一行导致进程退出,并且无处发送第二行。
    我曾经在一个工作过的程序中看到过一种技巧,它的作用与你想要的类似。该程序保留了许多shell,在其中运行命令并从这些命令中读取输出。所使用的技巧是始终写出一个“魔术”行来标记shell命令输出的结束,并使用该行来确定命令发送到shell的输出何时完成。

我获取了你的代码,并

writer
使用以下循环替换了分配给该行的所有内容:

while (scan.hasNext()) {    String input = scan.nextLine();    if (input.trim().equals("exit")) {        // Putting 'exit' amongst the echo --EOF--s below doesn't work.        writer.write("exitn");    } else {        writer.write("((" + input + ") && echo --EOF--) || echo --EOF--n");    }    writer.flush();    line = reader.readLine();    while (line != null && ! line.trim().equals("--EOF--")) {        System.out.println ("Stdout: " + line);        line = reader.readLine();    }    if (line == null) {        break;    }}

完成此操作后,我可以可靠地运行一些命令,并将每个命令的输出分别返回给我。

echo --EOF--
发送到shell的那一行中的两个命令可以确保–EOF–即使在命令出错的情况下也可以终止命令的输出。

当然,这种方法有其局限性。这些限制包括:

  • 如果我输入等待用户输入的命令(例如另一个外壳),则该程序似乎挂起,
  • 假设外壳程序运行的每个进程都以换行符结束其输出,
  • 如果shell运行的命令碰巧写了一行,就会感到困惑
    --EOF--
  • bash
    报告语法错误,如果输入的文本不匹配,则会退出)。

如果你要考虑的是计划任务中要执行的任务,那么这些要点可能对你而言并不重要,因为这些任务将仅限于一个命令或一小部分命令,这些命令或行为永远不会以这种病理方式表现。

编辑:在Linux上运行此命令后,改善退出处理和其他较小更改。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/381467.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号