Java 窗户吊管
这是一个令人沮丧的问题。我正在运行以下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
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管道变满,子流程将无法写入任何新数据;在大多数情况下,子进程将停止读取数据,直到完成挂起的写入。如果输出管道填满,代码就会死锁。当然,这并不能解释您在命令行中遇到的问题。在命令行中,管道中的第一个命令如何知道您何时完成了输入?管道是如何在命令行上失败的?它是否挂起?如果是,所有命令是否仍在运行(使用任务管理器)或仅其中一部分?