用java编写的简单haskell脚本
尝试使用java代码在Haskell中运行一个简单脚本。(视窗10) haskell脚本如下所示:用java编写的简单haskell脚本,java,haskell,Java,Haskell,尝试使用java代码在Haskell中运行一个简单脚本。(视窗10) haskell脚本如下所示: import Data.Char(toUpper) main = interact (map toUpper) 我用ghc制作了一个简单的.exe文件,它在cmd模块中可以正常工作。我写了一个简单的字符串,它用同样的大写字符串回复,我可以重复这个过程,直到我选择停止程序 但是,当我试图通过java运行这个程序时,它不会以这种方式工作。我可以输入,但是为了得到输出,我需要关闭输入 public c
import Data.Char(toUpper)
main = interact (map toUpper)
我用ghc制作了一个简单的.exe文件,它在cmd模块中可以正常工作。我写了一个简单的字符串,它用同样的大写字符串回复,我可以重复这个过程,直到我选择停止程序
但是,当我试图通过java运行这个程序时,它不会以这种方式工作。我可以输入,但是为了得到输出,我需要关闭输入
public class Main {
public static void main(String[] args) {
try {
Process process = new ProcessBuilder("simple").start();
InputStream processInputStream = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(processInputStream));
OutputStream processOutputStream = process.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(processOutputStream));
char[] bt = ("Hello").toCharArray();
writer.write(bt);
writer.flush();
writer.newLine();
processOutputStream.close(); -- Only works if I close output stream,.
System.out.println(reader.readLine());
}catch (IOException e) {
e.printStackTrace();
}
}
}
如何在java程序中关闭输出提要时获得输出
重新启动进程是可行的,但执行时间很糟糕
我已尝试对程序执行线程处理,但结果相同。
BufferedWriter
在执行newLine()
时不会自动刷新其输出。因此,您的Haskell程序将不会收到换行符并永远等待
当您调用close()
时,所有剩余的缓冲输出都被刷新(当然,您不想这样做)
因此,解决方案应该是
writer.write(bt);
writer.newLine();
writer.flush();
您还可以使用PrintWriter
,它有一个自动刷新换行选项,可以理解字符串(通过print
方法),因此无需处理char[]
最后,如果您计划同时发送大量文本,则可能必须调整缓冲区大小或使用多个线程,以避免程序无法再发送输出时出现死锁,因为接收Java端缓冲区已满,而您当前没有读取它。有关解决方案,请参见此。我做了一些实验,需要在Haskell端进行行缓冲,否则输出不会及时刷新
import Data.Char(toUpper)
import System.IO
main = do
hSetBuffering stdout LineBuffering
interact (map toUpper)
事实上,我发现当从java调用时,stdout
最初设置为BlockBuffering
,这将导致缓冲区过多
请注意,正如Thilo所指出的,为了在Haskell端使用
LineBuffering
,您必须在刷新(java)之前在java端使用writer.newLine()
,否则大写输出将不会刷新(Haskell)。您也尝试过Haskell端的@chi更改吗?谢谢。我仍然无法让它工作,在最后增加了同花顺。Printwriter和flush没有任何区别。如果没有冲水,关闭时甚至不会有结果。我会尝试他的解决方案,然后回来。谢谢:)您可以使用eta将haskell脚本编译成jar,并直接从java调用