Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 窗户吊管_Java_Windows_Pipe - Fatal编程技术网

Java 窗户吊管

Java 窗户吊管,java,windows,pipe,Java,Windows,Pipe,这是一个令人沮丧的问题。我正在运行以下Java代码: try { String query = someQuery, input = someInput; ProcessBuilder pb = new ProcessBuilder("cmd", "/c", query); // Windows Process p = pb.start(); BufferedReader stdInp

这是一个令人沮丧的问题。我正在运行以下Java代码:

       try {
            String query = someQuery, input = someInput;
            ProcessBuilder pb = new ProcessBuilder("cmd", "/c", query); // Windows
            Process p = pb.start();

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

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

            try
            {
                // Input to the query
                OutputStream os = p.getOutputStream();
                os.write(input.getBytes());
                os.flush();
                os.close();
            } catch (IOException e)
            {
            }

            System.out.println("STDIN : \n");

            while ((s = stdInput.readLine()) != null)
            {
                System.out.println(s);
            }

            System.exit(0);
        } catch (IOException e)
        {
            e.printStackTrace();
        }
query
是一个管道命令。
query
中的每个子命令都是一个类unix的API调用(专有:Sirsi Unicorn API,如果有人感兴趣);它也是一个数据库调用。windows命令提示符可以容纳这些API调用

问题:

如果我尝试使用管道传输2个数据库命令,程序将成功运行,但如果使用管道传输3个数据库命令,程序将挂起。如果在cygwin上运行这些相同的命令,则程序工作正常。有趣的是,如果我将3管道命令分解为两个单独的命令,程序运行良好

问题:

我的问题是-windows命令行上是否存在管道缓冲区问题?是否存在窗口上的管道不起作用的情况?管道可以暂停吗


在这一点上,任何信息都是值得赞赏的。

您能在没有Java的情况下(从shell)重现问题吗?是的。连贝壳都放弃了。我就是搞不懂这个!命令的方式是通过管道将一个命令的输出作为另一个命令的输入。e、 例如,selitem-iK-oN | selcharge-iN-oSHso在上面的示例中,selitem命令输出N,作为selcharge的输入。你可以选择输出一堆东西。e、 例如,selitem-iK-oNSKB | selcharge-iN-osh作为将来的参考,您的Java代码需要使用多个线程。使用当前代码,在完成所有查询的编写之前,您不会读取stdInput管道。这意味着,如果stdInput管道变满,子流程将无法写入任何新数据;在大多数情况下,子进程将停止读取数据,直到完成挂起的写入。如果输出管道填满,代码就会死锁。当然,这并不能解释您在命令行中遇到的问题。在命令行中,管道中的第一个命令如何知道您何时完成了输入?管道是如何在命令行上失败的?它是否挂起?如果是这样的话,所有的命令都还在运行(使用任务管理器)还是只有其中的一部分?你能在没有Java的情况下(从一个shell)重现这个问题吗?是的。连贝壳都放弃了。我就是搞不懂这个!命令的方式是通过管道将一个命令的输出作为另一个命令的输入。e、 例如,selitem-iK-oN | selcharge-iN-oSHso在上面的示例中,selitem命令输出N,作为selcharge的输入。你可以选择输出一堆东西。e、 例如,selitem-iK-oNSKB | selcharge-iN-osh作为将来的参考,您的Java代码需要使用多个线程。使用当前代码,在完成所有查询的编写之前,您不会读取stdInput管道。这意味着,如果stdInput管道变满,子流程将无法写入任何新数据;在大多数情况下,子进程将停止读取数据,直到完成挂起的写入。如果输出管道填满,代码就会死锁。当然,这并不能解释您在命令行中遇到的问题。在命令行中,管道中的第一个命令如何知道您何时完成了输入?管道是如何在命令行上失败的?它是否挂起?如果是,所有命令是否仍在运行(使用任务管理器)或仅其中一部分?