gpt4 book ai didi

java - 使用 Java ProcessBuilder : Why does hGetLine only return when I close outputStream? 运行 haskell 可执行文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:22:53 24 4
gpt4 key购买 nike

我将 FM-SBLEX Saldo 程序包装在 Java 库中。

Saldo 是用 Haskell 编写的,并在词典中查找标准输入中给出的行,例如

echo "ord"|./sblex/bin/saldo dicts/saldo.dict

将类似下面的内容打印到标准输出

{"ord":{"s_1":{"word":"ord","head":"sanna mina ord","pos":"abm","param":"invar 1:3-3","inhs":[],"id":"sanna_mina_ord..abm.1","p":"abm_i_till_exempel","attr":"3"},...

如果我运行它

./sblex/bin/saldo dicts/saldo.dict

它会查找我在控制台输入的每一行,直到我发送 EOF。

在我的 Java 库中,我使用 ProcessBuilder 启动它并设置一个线程将 stdout 和 stderr 转储到我程序的 stdout,另一个线程写入一个单词和一个换行符,然后刷新 outputStream

在控制台上,saldo 会在我每次按下回车键时返回结果,但在我的包装器中,它只会在我关闭 outputStream 后返回我所有输入的结果(请参阅下一个代码块中注释掉的 .close())

    ProcessBuilder pb = new ProcessBuilder(binPath, dictPath);

pb.redirectErrorStream(true);
saldoProcess = pb.start();

new Thread(new Reader(saldoProcess.getInputStream())).start();
new Thread(new Writer(saldoProcess.getOutputStream())).start();

saldoProcess.waitFor();
System.out.println("saldo exited.");
Thread.sleep(2000);

作者的运行覆盖:

    public void run() {
try {
outputStream.write("ord\n".getBytes());
outputStream.flush();
//outputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

读取输入的Haskell代码

run' :: Language a => a -> (String -> [Tok]) -> (String -> [[String]]) -> AnaType -> Stats -> IO Stats
run' l tokenizer f a st =
do b <- hIsEOF stdin
if b then return st
else do
s <- hGetLine stdin
analyze l a f (tokenizer s) st >>= run' l tokenizer f a

如果 binPath="cat"和 dictPath="-"我的 java 程序在每次刷新后输出输入。知道为什么这个 haskell 程序只在我关闭 outputStream 后才处理输入吗?

注意:如答案所示,不是 hGetLine 没有返回(正如我假设的那样),而是输出被缓冲了,因为我使用的 Haskell 实现默认阻止缓冲区,如果它不是从控制台。

最佳答案

您的 Haskell 程序可能正在缓冲其输出。 (写入终端时进行行缓冲,写入其他任何内容时进行 block 缓冲。)

尝试添加

hSetBuffering stdout LineBuffering

接近程序的开始。

More about buffering in Haskell.

(根据 Daniel Wagner 的评论进行编辑。)

关于java - 使用 Java ProcessBuilder : Why does hGetLine only return when I close outputStream? 运行 haskell 可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9956464/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com