Java调用Haskell编译的hello.exe读取输出异常如何修复?
解决Java调用Haskell编译exe时文件读取异常的问题
你遇到的情况是:单独运行hello.exe能正确读取test2.txt输出1 13 23,但通过Java的Runtime.exec()调用时却输出1 1 1。核心原因是进程工作目录不匹配。
问题分析
Java执行Runtime.exec()时,默认使用Java进程自身的工作目录(比如你的IDE项目根目录),而不是hello.exe所在的目录。你的Haskell代码里直接用相对路径"test2.txt"读取文件,此时hello.exe会在Java的工作目录下去找这个文件——而这个目录下的test2.txt可能是旧的,内容正好是1 1 1,所以才会输出错误结果。而你单独运行hello.exe时,是在它所在的目录下执行的,自然能读到Java写入的那个正确的test2.txt。
修复方案
方案1:修改Haskell代码,使用绝对路径读取文件
直接把Haskell代码里的文件路径改成Java写入的绝对路径,这样不管hello.exe在哪个目录运行,都能准确定位到目标文件:
import System.IO import Control.Monad import Data.List main = do -- 替换成你实际的test2.txt绝对路径 handle <- openFile "C:\\Users\\dabch\\OneDrive\\Desktop\\chepuch\\chich\\test2.txt" ReadMode contents <- hGetContents handle let sas = words contents putStrLn (unwords sas)
方案2:修改Java代码,指定exe的工作目录
使用Runtime.exec()的重载方法,指定hello.exe所在的目录作为进程的工作目录,这样exe就能读取同目录下的test2.txt:
import java.io.*; public class Main { public static void main(String[] args) throws IOException { String str = "1 13 23"; String filePath = "C:\\Users\\dabch\\OneDrive\\Desktop\\chepuch\\chich\\test2.txt"; BufferedWriter writer = new BufferedWriter(new FileWriter(filePath)); writer.write(str); writer.close(); String exePath = "C:\\Users\\dabch\\OneDrive\\Desktop\\chepuch\\chich\\hello.exe"; // 获取exe所在的目录 File workingDir = new File(new File(exePath).getParent()); // 调用exec时指定工作目录 Process p = Runtime.getRuntime().exec(exePath, null, workingDir); BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); String s; while((s = stdInput.readLine()) != null){ System.out.println(s); } stdInput.close(); } }
两种方案都能解决问题,方案2更灵活——如果后续文件路径变动,只需要修改Java代码里的路径配置即可,不需要重新编译Haskell程序。
内容的提问来源于stack exchange,提问作者Dabchinsky
相关产品推荐
相关产品推荐

