Java 无法在maven项目的/resources文件中使用FileOutputStream进行写入

Java 无法在maven项目的/resources文件中使用FileOutputStream进行写入,java,maven,io,Java,Maven,Io,在maven项目中,我在/resources文件夹下有一个image.jpg文件 当我尝试使用 private static File getImage(){ ClassLoader classLoader = Db.class.getClassLoader(); return new File(classLoader.getResource("image.jpg").getFile()); } 该文件正确返回,但当我尝试将该文件放入FileOutputStream以写入一些新

在maven项目中,我在/resources文件夹下有一个image.jpg文件

当我尝试使用

private static File getImage(){
    ClassLoader classLoader = Db.class.getClassLoader();
    return new File(classLoader.getResource("image.jpg").getFile());
}
该文件正确返回,但当我尝试将该文件放入FileOutputStream以写入一些新数据时,它不起作用

FileOutputStream fos = new FileOutputStream(getImage());
fos.write(blobImage.getBytes(1, (int)blobImage.length()));
fos.flush(); fos.close();
我没有错误,只是无法写入任何新内容,但是如果我将FileOutputStream更改为

FileOutputStream fos = new FileOutputStream( "C:\\...src\\main\\resources\\image.jpg");
它工作正常,图像将更改为blobImage文件中的任何内容。

此处:

private static File getImage(){
    ClassLoader classLoader = Db.class.getClassLoader();
    return new File(classLoader.getResource("image.jpg").getFile());
}
检索位于运行时类路径中的image.jpg:target/classes不在src/main/resources中

src/main/resources是在Maven构建期间使用的资源路径,而不是在运行时。 在process resources Maven阶段执行之后,位于src/main/resources中的文件/文件夹将复制到target/classes

因此,在更改之后,图像实际上已更改,但是哪个图像位于目标/类中


请注意,打包在jar/war中的资源是不可更改的。您将遇到锁定和缓存问题。如果可能会更改资源,则这些资源应位于组件之外:文件系统是映像的合理选择。

始终使用class.getResourcesStream/image.jpg而不是file…并且永远不要在代码中使用基于文件对象的绝对路径…当从未爆炸的WAR文件执行代码时会发生什么?写入将失败。您通常不应该写入应用程序的资源中。永久状态应该放在数据库中,临时状态应该放在临时文件中。我知道,有没有一种方法可以用java代码覆盖resources文件夹中的image.jpg,而不必使用绝对路径?事实上,jar/war中打包的资源是不会被更改的。您将遇到锁定和缓存问题。如果可能会更改资源,则这些资源应位于组件外部。