Tomcat WAR包中读取JSON文件失败:InputStream返回空异常
解决Web应用中getResourceAsStream读取JSON文件返回null的问题
看起来你在读取resources下的JSON文件时踩了几个常见的坑,我来帮你一步步排查和解决:
首先,最容易忽略的:文件名和路径不匹配
你说要读取的是resources/data/info.json,但代码里写的是\\WEB-INF\\classes\\data\\Address.json——文件名从info.json变成了Address.json,这肯定会找不到文件啊!先把文件名改回一致的,这是首要前提。
修正路径格式和写法
Java中类加载器的资源路径不使用Windows的反斜杠\\,而是统一用正斜杠/,而且路径规则要注意:
方案1:使用绝对路径(推荐,不受类所在包影响)
因为resources目录下的文件编译后会被放到WEB-INF/classes根目录下,所以data/info.json的类路径绝对路径是/data/info.json,代码改成:
InputStream is = Convertor.class.getResourceAsStream("/data/info.json");
方案2:使用类加载器直接读取(更简洁)
用类加载器的getResourceAsStream方法,不需要开头的/,它默认从类路径根开始查找:
InputStream is = Convertor.class.getClassLoader().getResourceAsStream("data/info.json");
方案3:相对路径(不推荐,依赖类的包结构)
如果你的Convertor类在根包(没有包名),可以用相对路径:
InputStream is = Convertor.class.getResourceAsStream("data/info.json");
但如果Convertor在某个子包下(比如com.example.utils),相对路径需要往上回退,比如../../data/info.json——这种方式很脆弱,包结构一变就失效,所以还是推荐前两种方案。
额外排查点
- 确认编译后文件是否存在:检查你的Web应用编译后的
WEB-INF/classes/data目录下有没有info.json。有些IDE或构建工具(比如Maven如果配置错了)可能不会自动复制resources下的文件到classes目录,这时候需要调整构建配置。 - 加个空判断避免异常:读取后先检查InputStream是否为null,提前抛出明确的错误信息,方便排查:
InputStream is = Convertor.class.getResourceAsStream("/data/info.json"); if (is == null) { throw new RuntimeException("找不到目标文件,请检查路径是否正确,或文件是否已被编译到classes目录"); } // 后续的JSON读取操作
内容的提问来源于stack exchange,提问作者Raghuveer
相关产品推荐
相关产品推荐

