不能直接从jar 读取文件
What is a file?
https://www.computerhope.com/jargon/f/file.htm
文件的权限 delete,execute,read,write,readlink
abc.jar 是一个file
abc.jar!\test.xml 不是一个file,因为在电脑上不能用ls或dir将它显示出来。它是文件的内容的一部分,是二进制流。
测试
项目一
z-bean. ├─src │ ├─main │ │ ├─java │ │ └─resources │ │ test.xml
项目二(依赖一)
z-test. │ ├─src │ ├─main │ │ ├─java │ │ │ Main.java
测试方法
import java.io.File; import java.io.IOException; import java.net.URL; public class Main { public static void main(String[] args) throws IOException { URL resource = Main.class.getClassLoader().getResource("test.xml"); File file = new File(resource.getFile()); System.out.println(file.exists()); } }
case1: 在eclipse中,两个项目都打开(文件夹源码形式依赖)
true
case2:在eclipse中,将z-bean 项目关闭(jar包形式依赖)
false
类似的还有:
import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import com.ibatis.common.resources.Resources; public class Main { public static void main(String[] args) throws IOException { //此处如果用AsFile 则不存在,如果用stream或者reader则可以 // InputStream resourceAsStream = Resources.getResourceAsStream("test.xml"); // Reader resourceAsReader = Resources.getResourceAsReader("test.xml"); File resourceAsFile = Resources.getResourceAsFile("test.xml"); System.out.println(resourceAsFile.exists()); } }
小结
如果不能用计算机的命令展示(dir 或ls)的文件,都不存在。
jar包里的资源文件需要用流形式获取