版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012572955/article/details/52880520
我们经常在java的io操作中读取文件,先看一个场景:

这样是读不到这个file文件的,会发生filenotfoundexception

如果我把文件放到了src/main/java下呢,还是会发生filenotfoundexception。

这里就涉及到一个java编译时的问题,请看图:

如果我的:

File f = new File("F:\\bi\\Generate\\src\\main\\java\\1.txt"); 试用未编译前的绝对路径,当然是可以读到文件内容的。

那么问题来了,我们经常在web项目中引用一个这样文件,但是上传的是打包后的经过编译的源码,这个绝对路径就不存在了,那么打包后的1.txt位于何处呢?在这里:

我们怎么才能读到这个文件呢,下面就引入了java提供的getClassLoader().getResource和getResource的问题,我们先看下面这段代码:

public class TestFile {

@Test
public void test1() throws IOException {
System.out.println(TestFile.class.getResource("/")); //到classes目录
System.out.println(TestFile.class.getResource("")); //到具体包所在目录
System.out.println(TestFile.class.getClassLoader().getResource("")); //到classes目录
System.out.println(TestFile.class.getClassLoader().getResource("/")); // null // File f = new File("F:\\bi\\Generate\\src\\main\\java\\1.txt");
// BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
// String line = "";
// while((line = br.readLine()) != null) {
// System.out.println(line);
// } }
}

结果为:
file:/F:/bi/Generate/target/test-classes/
file:/F:/bi/Generate/target/classes/com/tanlei/test/
file:/F:/bi/Generate/target/test-classes/
null

结论就是:

TestFile.class.getResource("/") 到编译后的classes目录,只不过加了前缀 file:

TestFile.class.getResource("")到具体包所在目录,只不过加了前缀 file:

TestFile.class.getClassLoader().getResource("") 到编译后的classes目录,只不过加了前缀 file:

TestFile.class.getClassLoader().getResource("/") 为null,获取不到

TestFile.class.getResource("/") = TestFile.class.getClassLoader().getResource("")

这里还有个问题就是:

getResource和getResourceAsStream的区别,

getResourceAsStream是返回所在文件的流,下面这段代码的解释显而易见:

先看图,1.txt的位置如下

值得注意的是:

在maven中:

src/main/java和src/main/resource的内容在编译后都位于/target/classes/目录下;

src/test/java和src/test/resource的内容在编译后都位于/target/test-classes/目录下;

我们要获取位于/target/classes/下的1.txt,代码可以改变如下:

import org.junit.Test;

public class TestFile {

@Test
public void test1() throws IOException {
System.out.println(TestFile.class.getResource("/")); //到classes目录
System.out.println(TestFile.class.getResource("")); //到具体包所在目录
System.out.println(TestFile.class.getClassLoader().getResource("")); //到classes目录
System.out.println(TestFile.class.getClassLoader().getResource("/")); // null // File f = new File("F:\\bi\\Generate\\src\\main\\java\\1.txt");
// BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
BufferedReader br = new BufferedReader(new InputStreamReader(TestFile.class.getResourceAsStream("/1.txt")));
String line = "";
while((line = br.readLine()) != null) {
System.out.println(line);
} }
}

利用getResourceAsStream和前面所讲的四种情况的区别,即可获取文件的流。
是不是已经讲的很清楚了!
--------------------- 
作者:u012572955 
来源:CSDN 
原文:https://blog.csdn.net/u012572955/article/details/52880520 
版权声明:本文为博主原创文章,转载请附上博文链接!

【转载】java文件路径问题及getResource和getClassLoader().getResource的区别的更多相关文章

  1. Java 文件路径相关

    不得不说Java的文件路径弄得很复杂, 有编译目录和resource目录什么的和解释型语言(PHP)的就是不一样 搞了好几年java一直没认真去研究这些个破路径怎么回事, 每次都忘记, 梳理一下备忘 ...

  2. Java文件路径

    几大常用的方法 Class.getResource("")    返回的是当前Class这个类所在包开始的位置 getClassLoader().getResource(" ...

  3. [转载]Java迭代器(iterator详解以及和for循环的区别)

    Java迭代器(iterator详解以及和for循环的区别) 觉得有用的话,欢迎一起讨论相互学习~[Follow] 转载自 https://blog.csdn.net/Jae_Wang/article ...

  4. Java 文件路径的读取

    记得在操作系统中了解到文件读取有两种方式,当然这在各编程语言中也是通用的,所以java路径也分,相对和绝对路径. 绝对路径 绝对路径URI ,听着和URL非常相似.那我们就来看看吧. URI(Unif ...

  5. 在Tomcat下指定Jsp生成的Java文件路径

    在tomcat的配置文件server.xml(路径:tomcat路径\conf下面)里,找到:<Context docBase="D:/workspace/icinfo/trunk/w ...

  6. [ 转载 ]Java:成员变量,局部变量,静态变量的区别

    精简后方便自己理解. 成员变量 我们研究一个事物: 属性:外在特征:如身高,体重 行为:能做什么:如说话,打球. 在Java语言中,最基本的单位是类(class),类就是用来体现事物的. 属性:类中的 ...

  7. [转载]Java中的String,StringBuilder,StringBuffer三者的区别

    最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...

  8. java项目中获取文件路径的几种方法

    // 第一种: 2 File f = new File(this.getClass().getResource("/").getPath()); // 结果: /Users/adm ...

  9. Spring boot 文件路径读取异常

    在开发代码中,有一段需要获取resources目录下的一个配置文件(这里写作test.xml). 这段代码在ide中没有任何问题,但是一打成jar包发布到线上,这段代码就会报找不到对应文件的错误. 按 ...

随机推荐

  1. [bzoj3126][USACO2013]Photo_动态规划_单调队列

    Photo bzoj-3126 题目大意:给你一个n长度的数轴和m个区间,每个区间里有且仅有一个点,问最多能有多少个点. 注释:$1\le n \le 2\cdot 10^5$,$1\le m\le1 ...

  2. iOS:改变UITableViewCell的选中背景色

    要改变UITableViewCell选中时的背景色,需要在-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtInde ...

  3. iOS UITableView 去除多余切割线

    在UITableView初始化时加上下面代码就可以: self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero ...

  4. 【 D3.js 进阶系列 — 2.2 】 力学图的參数

    力学图的布局中有非常多參数.本文将逐个说明. D3 中的力学图布局是使用韦尔莱积分法计算的.这是一种用于求解牛顿运动方程的数值方法,被广泛应用于分子动力学模拟以及视频游戏中. 定义布局的代码例如以下: ...

  5. word2vec和word embedding有什么区别?

    word2vec和word embedding有什么区别? 我知道这两个都能将词向量化,但有什么区别?这两个术语的中文是什么? from: https://www.zhihu.com/question ...

  6. hdu 2205(容斥原理)

    Eddy's爱好 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  7. Python 下的数据结构实现

    既然采用了 Python 编程语言实现数据结构,就要充分发挥 Python 语言的语法特性. 参考<Python 算法教程><数据结构与算法 -- Python 语言描述>: ...

  8. LA4788

    贪心 这个贪心不太懂啊 dfs返回子树需要的最小值,然后按需要减消耗排序,然后贪心选取即可. #include<bits/stdc++.h> using namespace std; ty ...

  9. [Apple开发者帐户帮助]二、管理你的团队(1)邀请团队成员

    组织可以选择向其开发团队添加其他人员.如果您已加入Apple开发者计划,您将在App Store Connect中管理团队成员.有关详细信息,请转到在App Store Connect帮助中添加用户. ...

  10. Appium - xpath

    基本属性定位 以淘宝app为例,定位左上角扫一扫按钮 1.可以通过text文本定位到 //*[@text='text文本属性'] # 定位text driver.find_element_by_xpa ...