You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:05:20