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

部署到JBoss后Java无法读取CSV文件的问题求助

问题解决方法

核心原因

部署到WildFly(JBoss)后,scriptSQL.csv被打包进WAR/EAR文件内部,不再是磁盘上的独立文件。原代码用File读取资源的方式仅适用于本地开发时的文件系统环境,且getResource().getPath()返回的URL编码路径(含%20)会导致File无法识别真实路径。

修正方案:用类加载器直接读取资源流

替换原getScript()方法,通过getResourceAsStream()直接获取输入流读取资源,无需依赖文件系统路径:

public Map<String, String> getScript() throws IOException {
    Map<String, String> map = new HashMap<>();
    // 直接通过类加载器获取资源流
    try (InputStream is = getClass().getClassLoader().getResourceAsStream("scriptSQL.csv");
         BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) {
        String line;
        while ((line = br.readLine()) != null) {
            // 跳过空行,避免格式错误
            if (line.trim().isEmpty()) {
                continue;
            }
            String[] arr = line.split(";");
            // 校验数组长度,防止越界
            if (arr.length >= 2) {
                map.put(arr[0].trim(), arr[1].trim());
            }
        }
    }
    this.sqlScript = map;
    return map;
}

public String getKey(String key) {
    if (this.sqlScript != null && this.sqlScript.containsKey(key) && !this.sqlScript.get(key).isEmpty()) {
        return sqlScript.get(key);
    } else {
        try {
            sqlScript = getScript();
        } catch (IOException e) {
            throw new RuntimeException("读取SQL脚本资源失败", e);
        }
    }
    return sqlScript.getOrDefault(key, null);
}

额外注意事项

  • 确保scriptSQL.csv放在项目的src/main/resources目录下(Maven/Gradle项目),编译后会自动打包到WEB-INF/classes目录,类加载器可正确识别。
  • 指定字符编码(如UTF-8),避免不同环境下的中文乱码问题。
  • 新增空行和数组长度校验,避免CSV格式错误引发运行时异常。
  • 使用try-with-resources语法自动关闭流资源,防止内存泄漏。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 14:32:21