一、java获取文件分两种情况:编译前获取和编译后获取。
编译前通常用File类,如 File file = new File(“D:/test.txt”)
编译后从.class文件为着手点,有
File file = new File(XX.class.getResource("test.txt").getFile())
InputStream inputStream=XX.class.getResourceAsStream("test.txt")
具体方法:
工程目录如下:
获取编译前file1文件
方法一:File file = new File(“E:/JAVA/IntelliJIDEA/workspace/project/src/java/file1.txt”);
方法二:File file = new File(“/src/java/file1.txt”);
获取编译后file2与file3文件
file2.txt:
File file2 = new File(Test.class.getResource(“file/file2.txt”).getFile());
File file2 = new File(Test.class.getClassLoader().getResource(“file/file2.txt”).getFile());
file3.txt:
File file3 = new File(Test.class.getClassLoader().getResource("file3.txt"n).getFile());
注:
1.Test.class.getResource(String path) :path不以”/“开头时默认是从此类所在的包下去资源,以"/"开头则是从ClassPath跟下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
2.Test.class.getClassLoader.getResource(String path) :从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。 class.getResource(“/”) == class.getClassLoader().getResource(“”)
3.getResource 返回的是个 URL 对象,不是 File 对象,用.getFile() 返回 URL 的路径
4. ”/“代表了工程的根目录,如工程名为 project 。”/“代表了project;前面没有”/“代表当前类的目录。
5.getResourceAsStream()方法,参数是与getResouce()方法是一样的,它相当于你用getResource()取得File文件后,再new InputStream(file)一样的结果。getResourceAsStream读取的文件路径只局限与工程的源文件夹中,包括在工程src根目录下,以及类包里面任何位置,但是如果配置文件路径是在除了源文件夹之外的其他文件夹中时,该方法是用不了的。
6.当打成jar包时,获取resource目录下的文件,使用getResource()时会出现FileNotFoundException:/opt/supplier_web/supplier_web.jar!/BOOT-INF/lib/supplier_web.web-0.0.1.jar!/font/simsun.ttf (No such file or directory)。这是因为打包后Spring试图访问文件系统路径,但无法访问JAR中的路径。
需要用getResourceAsStream()方法
二、jar包中读取文件系统绝对路径,相对路径,以及jar包内部路径的写法
1.在jar包代码中要使用操作系统的绝对路径,路径以/开始。
2.在jar包代码中使用,起点是jar所在目录。比如说test.jar所处位置为/opt/test/test.jar,那么你在代码中写相对路径“pathTest/hahatxt”,那么实际指向的位置为opt/test/pathTest/haha.txt
3.在jar包代码中使用:
InputStream =this.getClass().getResourceAsStream(path)的写法。不管路径是否以/开始,都是从jar包内部的根目录为起点。
4.InputStream 的三种写法
InputStream resourceAsStream =new Settings().getClass().getResourceAsStream("");
InputStream resourceAsStream =PB.class.getResourceAsStream("");
InputStream resourceAsStream =this.getClass().getResourceAsStream("");
读取jar包内的文件,错误写法
String filePath = PBCDownloadBiz.class.getClassLoader().getResource("reportTemplate/demo1.xls").getFile();
FileInputStream fileInputStream = new FileInputStream(filePath);
Workbook hssfWorkbook = new HSSFWorkbook(fileInputStream);
正确写法
InputStream resourceAsStream = PBCDownloadBiz.class.getResourceAsStream("/reportTemplate/CentralBank299.xls");
Workbook hssfWorkbook = new HSSFWorkbook(resourceAsStream);