java获取文件和jar包获取文件:路径问题以及getResource()和getResourceAsStream

一、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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值