java.io.FileReader文件读取路径问题:本地与AWS Tomcat部署场景
解决Tomcat(AWS部署)中FileReader找不到资源的问题
嗨,我帮你捋清楚这个问题哈~你遇到的核心问题是用FileReader直接读取war包内的资源本身就不是正确的姿势,因为FileReader依赖的是文件系统的绝对路径,但Tomcat(尤其是AWS上的)会把war包解压到你无法预知的临时路径里,而且类路径下的资源并不一定对应文件系统里的独立文件(比如如果war包没解压直接运行的话)。
给你几个靠谱的解决方案,都是Java Web项目里读取内部资源的标准做法:
1. 把文件放到类路径下,用类加载器读取
首先把你的enrollment.json放到WEB-INF/classes文件夹里(如果是用Maven/Gradle构建的项目,直接放到src/main/resources目录下,打包时会自动复制到WEB-INF/classes里)。
然后不要再用FileReader,改用类加载器获取输入流来读取:
// 获取类加载器,读取类路径根目录下的enrollment.json InputStream inputStream = getClass().getClassLoader().getResourceAsStream("enrollment.json"); // 包装成字符流方便读取,指定编码避免乱码 BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); // 接下来就可以读取内容了,比如逐行处理 String line; while ((line = reader.readLine()) != null) { // 处理每行内容逻辑 } // 记得用完后关闭流(也可以用try-with-resources自动关闭) reader.close(); inputStream.close();
如果你的类是Servlet,也可以用getServletContext().getResourceAsStream("/WEB-INF/classes/enrollment.json")来获取流,效果是完全一致的。
2. 为什么FileReader行不通?
- 本地运行时你用的是绝对路径,那是因为你明确知道文件在本地磁盘的位置,但部署到AWS Tomcat后,war包会被解压到Tomcat的
webapps目录下的随机子文件夹,这个路径是容器自动分配的,你没法硬编码到代码里。 - 就算你临时找到了解压路径,一旦Tomcat重启或者AWS实例更换,这个路径大概率会变动,代码直接失效。
- 更关键的是,有些容器支持直接运行war包而不解压,这时候
FileReader根本找不到对应的文件——因为资源是封装在war包内部的,不是文件系统里的独立实体。
3. 本地测试也能兼容
用类加载器的方式读取,本地运行时只要把enrollment.json放到resources目录(或者classes目录),代码不用做任何修改就能直接读到,不用写死本地的绝对路径,这样本地开发和服务器部署的代码完全一致,彻底避免了环境差异带来的问题。
内容的提问来源于stack exchange,提问作者Allen Cypher
相关产品推荐
相关产品推荐

