Mac环境下访问.yml文件遭遇Stream Closed错误,寻求解决方案
解决Mac环境下读取YAML文件时的Stream Closed错误
可能的原因及对应解决方案
1. 资源路径或classpath配置错误
ClassLoader的getResourceAsStream从classpath根目录查找资源,若src/yml/server.yml未被正确打包到classpath中,会导致流对象为null,后续操作触发异常。
- Maven项目配置:在
pom.xml中添加资源目录配置,将src/yml纳入构建资源:
<build> <resources> <resource> <directory>src/yml</directory> <includes> <include>**/*.yml</include> </includes> </resource> <resource> <directory>src/main/resources</directory> </resource> </resources> <!-- 测试环境需额外配置 --> <testResources> <testResource> <directory>src/yml</directory> <includes> <include>**/*.yml</include> </includes> </testResource> </testResources> </build>
- Gradle项目配置:在
build.gradle中配置sourceSets:
sourceSets { main { resources { srcDirs += 'src/yml' } } test { resources { srcDirs += 'src/yml' } } }
2. 流未正确检查与管理
原代码未判断流是否为null,且未用try-with-resources自动关闭流,可能导致流提前关闭或空指针引发异常。修正后的代码:
Yaml yaml = new Yaml(); // 使用try-with-resources自动管理流生命周期 try (InputStream ymlReader = this.getClass().getClassLoader().getResourceAsStream("yml/server.yml")) { // 先检查流是否存在 if (ymlReader == null) { throw new FileNotFoundException("资源文件 yml/server.yml 未在classpath中找到"); } Map<String, Object> yamlMaps = yaml.load(ymlReader); // 修正日志输出格式(原代码缺少占位符) LOG.info("Value of Status Flag: {}", yamlMaps.get("status")); } catch (IOException e) { LOG.error("读取YAML文件失败", e); }
3. Mac环境大小写问题
Mac默认文件系统不区分大小写,但classpath中的资源路径严格区分大小写。检查代码中的路径(如yml/server.yml)与实际文件名是否完全一致(包括大小写,比如是否实际是Server.yml或YML/server.yml)。
4. 文件权限问题(罕见但需排查)
确保当前用户对src/yml/server.yml有读取权限,可通过终端执行以下命令检查:
ls -l src/yml/server.yml
若权限不足,执行:
chmod +r src/yml/server.yml
内容的提问来源于stack exchange,提问作者GPark
相关产品推荐
相关产品推荐

