Spring MVC控制器修改文件写入路径至resources目录
解决Spring项目中相对路径写入文件的空指针问题
我猜你是想把文件从硬编码的绝对路径改成项目内的resources目录,但碰上空指针异常了对吧?这是因为在Tomcat+Spring这类Web项目里,直接用相对路径resources/file.txt根本不是指向你开发时的src/main/resources目录,运行时的文件结构和开发阶段完全不一样,路径解析失败就触发了NPE。
下面给你两种可行的方案,按需选择:
方案一:开发阶段写入项目的resources目录(仅用于本地调试)
如果你只是本地开发时需要往项目的resources目录写文件,可以用Spring的工具获取这个目录的真实绝对路径:
@Autowired private ApplicationContext applicationContext; public void writeToResources() throws IOException { String message = "Hello World"; // 获取resources目录的资源对象 Resource resource = applicationContext.getResource("classpath:"); // 转成文件系统路径 File resourcesDir = resource.getFile(); // 拼出目标文件的路径 File targetFile = new File(resourcesDir, "file.txt"); Files.write(targetFile.toPath(), message.getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE); }
⚠️ 注意:这个方法只在本地开发时能用,把项目打包成WAR/JAR部署到服务器后,classpath:对应的是压缩包内部的资源,没法直接当成文件系统的文件写入,到时候会抛FileNotFoundException。
方案二:运行时写入外部目录(生产环境首选)
生产环境绝对不建议往resources目录写东西,一来容器运行时通常会限制修改应用内部文件,二来打包后的资源都是只读的。推荐指定一个外部可写目录,或者基于项目运行目录创建resources文件夹:
public void writeToExternalDir() throws IOException { String message = "Hello World"; // 获取项目运行的根目录 String baseDir = System.getProperty("user.dir"); // 创建resources目录(不存在就新建) File resourcesDir = new File(baseDir, "resources"); if (!resourcesDir.exists()) { resourcesDir.mkdirs(); } // 目标文件 File targetFile = new File(resourcesDir, "file.txt"); Files.write(targetFile.toPath(), message.getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE); }
不管是开发还是生产环境,这个方法都会在项目运行的根目录下创建resources文件夹并写入文件,既避免了路径解析的坑,也符合生产环境的规范。
为啥你之前的代码会报NPE?
你直接用Paths.get("resources/file.txt")的时候,这个相对路径是相对于Tomcat的启动目录(比如Tomcat的bin文件夹),而不是你的项目目录,这个目录下基本不可能有resources文件夹,导致后续文件操作时拿到null,触发空指针异常。
内容的提问来源于stack exchange,提问作者Ashok Charu
相关产品推荐
相关产品推荐

