部署到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
相关产品推荐
相关产品推荐

