写入在 Windows 下的 Java 应用程序中生成的 C++ 控制台应用程序

Posted

技术标签:

【中文标题】写入在 Windows 下的 Java 应用程序中生成的 C++ 控制台应用程序【英文标题】:Writing To C++ Console Application Spawned Within Java App Under Windows 【发布时间】:2012-07-02 23:52:21 【问题描述】:

如何在 Windows 下将字符串数据从 Java 发送到 C++ 控制台应用程序?我正在尝试这样做:

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream()));
String o = ...;
proc.getOutputStream().write(o.getBytes());

但是当我这样做时,我从未在 C++ 端看到它:

ReadFile(stdin_h,buf, sizeof(buf), &bytes, 0)

ReadFile 永不返回。

接下来是进一步的阐述和示例代码。


我编写了一个简单的 C++ 控制台 (Win32) 应用程序,它从 STDIN 读取并根据输入执行操作。

现在我想编写一个 Java 应用程序来“驱动”C++ 应用程序。 Java 应用程序应该:

    使用Runtime.exec() 启动 C++ 应用程序 将字符串数据写入 C++ 应用的 STDIN 重复直到死亡。

我的 Java 应用程序似乎正在运行,但 C++ 应用程序从未在 STDIN 上接收到任何数据。

这是 C++ 应用程序:

int main()

    ofstream f("c:\\temp\\hacks.txt");

    HANDLE stdin_h = GetStdHandle(STD_INPUT_HANDLE);
    DWORD file_type = GetFileType(stdin_h);
    if( file_type != FILE_TYPE_CHAR )   
        return 42;

    f << "Pipe" << endl;
    for( bool cont = true; cont; )
    
        char buf[64*1024] = ;
        DWORD bytes = 0;
        if( ReadFile(stdin_h,buf, sizeof(buf), &bytes, 0) )
        
            string in(buf,bytes);
            cout << "Got " << in.length() << " bytes: '" << in << "'" << endl;
            f << "Got " << in.length() << " bytes: '" << in << "'" << endl;
            if( in.find('Q') )
                cont = false;
        
        else
        
            cout << "Err " << GetLastError() << " while reading file" << endl;
            f << "Err " << GetLastError() << " while reading file" << endl;
        
    

这里是 Java 方面:

public static void main(String[] args) 
    Runtime rt =Runtime.getRuntime();
    try 
        Process proc = rt.exec("c:\\dev\\hacks\\x64\\debug\\hacks.exe");

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream()));

        int a = 0;
        while(a < 5)
        
            String o = (a == 4 ? "Q\n" : "A\n");
            proc.getOutputStream().write(o.getBytes());
            System.out.println("Wrote '" + o + "'");
            ++a;
        
        try 
            proc.waitFor();

            // TODO code application logic here
         catch (InterruptedException ex) 
            Logger.getLogger(Java_hacks.class.getName()).log(Level.SEVERE, null, ex);
        
     catch (IOException ex) 
        Logger.getLogger(Java_hacks.class.getName()).log(Level.SEVERE, null, ex);
    

Java 端似乎工作正常,但我从未收到 C++ 端的字符串。

我在这里做错了吗?如何在 Windows 下将字符串数据从 Java 发送到 C++ 控制台应用程序?

【问题讨论】:

【参考方案1】:

为什么在写完 5 个字符串之后不刷新 Java 端的输出流?

proc.getOutputStream().flush();

【讨论】:

+1:呃,因为我不够聪明,不知道我应该这样做。 :) 等一下,让我试试。 宾果游戏!我知道我们不应该说“谢谢”,但谢谢。我的 6 小时调试会话已经结束。 哈哈! :D \o/ 很高兴我能帮到你先生 :) 仍在延时。我会。 :) 您的问题与其他问题相比真是令人耳目一新! ;)

以上是关于写入在 Windows 下的 Java 应用程序中生成的 C++ 控制台应用程序的主要内容,如果未能解决你的问题,请参考以下文章

java程序,在linux下能否调用windows下的mysql。。。。。。急急急急

java jni 怎么在windows环境中编译成linux下的so文件

使用 Java 读取/写入 Windows 注册表

如何修改windows下的python包管理仓库的地址

怎么样把windows下的java程序放到linux下运行~!

Windows-Service 中的 Serilog 未写入日志文件