使用管道和java重定向输入

时间:2014-02-11 02:38:13

标签: java windows visual-c++ pipe jline

我在MSDN中阅读了Creating a Child Process with Redirected Input and Output

我已重定向输出。但在我的情况下,重定向输入与此示例不同。

我在子进程中运行java -jar xxx.jar。将输入重定向到stdinPipe成功。但是我发现子进程jar没有读取输入。

我已重定向输入句柄,如下所示:

ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
siStartInfo.cb = sizeof(STARTUPINFO); 
siStartInfo.hStdError = g_hChildStd_OUT_Wr;
siStartInfo.hStdOutput = g_hChildStd_OUT_Wr;
siStartInfo.hStdInput = g_hChildStd_IN_Rd;
siStartInfo.dwFlags |= STARTF_USESTDHANDLES;

// Create the child process. 

bSuccess = CreateProcess(NULL, 
    szCmdline,     // command line which I use "java -jar xxx.jar"
    NULL,          // process security attributes 
    NULL,          // primary thread security attributes 
    TRUE,          // handles are inherited 
    0,             // creation flags 
    NULL,          // use parent's environment 
    NULL,          // use parent's current directory 
    &siStartInfo,  // STARTUPINFO pointer 
    &piProcInfo);  // receives PROCESS_INFORMATION 

当我使用bSuccess = WriteFile(g_hChildStd_IN_Wr, pCmd, strlen(pCmd), &dwWritten, NULL);时。它在我的小测试jar文件上运行完美,该文件使用System.out.println()System.in.read()来输出和输入。

但是当我运行jar服务器时,输入无效且重定向失败。我唯一知道的是jar使用ConsoleReader(System.in, System.out)。我不熟悉java。所以任何人都可以知道禁止的内容我要重定向输入?

非常感谢!!

P.S。源代码与开头给出的链接相同。


最后我发现问题在于jline.console.ConsoleReader.readLine(">",null)。我用arg -nojline运行java,一切都很好!

我还没有读过jline.console.ConsoleReader的源代码。我很高兴有人能说出System.in.read()jline.console.ConsoleReader.readLine(">",null)之间的区别。

问题代码如下:

if (!useConsole) {
        return;
    }
    // CraftBukkit end

    jline.console.ConsoleReader bufferedreader = this.server.reader; // CraftBukkit
    String s;

    try {
        // CraftBukkit start - JLine disabling compatibility
        while (!this.server.isStopped() && this.server.isRunning()) {
            if (useJline) {
                s = bufferedreader.readLine(">", null);
            } else {
                s = bufferedreader.readLine();
            }
            if (s != null) {
                this.server.issueCommand(s, this.server);
            }
            // CraftBukkit end
        }
    } catch (IOException ioexception) {
        DedicatedServer.az().error("Exception handling console input", ioexception);
    }

因此,使用jline.console.ConsoleReader.readline()也与jline.console.ConsoleReader.readline(">",null)不同。

我会继续研究。


The jline source code

readline()函数等于readline(null,null)。这意味着“>”根据第493行的源代码,不会显示提示但其他是相同的。所以我怀疑是我的Windows操作系统(win8.1)导致代码运行到if (!terminal.isSupported())代码?或者我还没有理解源代码?不熟悉java是如此困难。

0 个答案:

没有答案