【转载】java文件路径问题及getResource和getClassLoader().getResource的区别
版权声明:本文为博主原创文章,未经博主允许不得转载。 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的区别的更多相关文章
- Java 文件路径相关
不得不说Java的文件路径弄得很复杂, 有编译目录和resource目录什么的和解释型语言(PHP)的就是不一样 搞了好几年java一直没认真去研究这些个破路径怎么回事, 每次都忘记, 梳理一下备忘 ...
- Java文件路径
几大常用的方法 Class.getResource("") 返回的是当前Class这个类所在包开始的位置 getClassLoader().getResource(" ...
- [转载]Java迭代器(iterator详解以及和for循环的区别)
Java迭代器(iterator详解以及和for循环的区别) 觉得有用的话,欢迎一起讨论相互学习~[Follow] 转载自 https://blog.csdn.net/Jae_Wang/article ...
- Java 文件路径的读取
记得在操作系统中了解到文件读取有两种方式,当然这在各编程语言中也是通用的,所以java路径也分,相对和绝对路径. 绝对路径 绝对路径URI ,听着和URL非常相似.那我们就来看看吧. URI(Unif ...
- 在Tomcat下指定Jsp生成的Java文件路径
在tomcat的配置文件server.xml(路径:tomcat路径\conf下面)里,找到:<Context docBase="D:/workspace/icinfo/trunk/w ...
- [ 转载 ]Java:成员变量,局部变量,静态变量的区别
精简后方便自己理解. 成员变量 我们研究一个事物: 属性:外在特征:如身高,体重 行为:能做什么:如说话,打球. 在Java语言中,最基本的单位是类(class),类就是用来体现事物的. 属性:类中的 ...
- [转载]Java中的String,StringBuilder,StringBuffer三者的区别
最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...
- java项目中获取文件路径的几种方法
// 第一种: 2 File f = new File(this.getClass().getResource("/").getPath()); // 结果: /Users/adm ...
- Spring boot 文件路径读取异常
在开发代码中,有一段需要获取resources目录下的一个配置文件(这里写作test.xml). 这段代码在ide中没有任何问题,但是一打成jar包发布到线上,这段代码就会报找不到对应文件的错误. 按 ...
随机推荐
- java面向接口编程
在oop中有一种设计原则是面向接口编程,面向接口编程有非常多优点,详细百度一大片.我来谈一下详细的使用中的一些不成熟的见解.! 首先面向接口编程能够消除类之间的依赖关系,使得业务仅仅依赖接口. 这样有 ...
- CodeForces 444C. DZY Loves Physics(枚举+水题)
转载请注明出处:http://blog.csdn.net/u012860063/article/details/37509207 题目链接:http://codeforces.com/contest/ ...
- VassistX 凝视 模板
避免头文件反复包括宏定义: #ifndef $FILE_BASE_UPPER$_H_ #define $FILE_BASE_UPPER$_H_ $selected$ #endif // $FILE_B ...
- Android ListView 和 ScrollView 冲突问题
近期做一款APP,当中有一个类似微博的评论功能的界面,先是列出微博的正文内容和图片等.然后下边是评论. 一開始就想着用一个ScrollView把主要内容和评论区的ListView包起来.然后加入各个控 ...
- Spring:验证用户登录
利用 Spring IOC 技术实现用户登录的验证机制,对用户进行登录验证. 首先利用 Spring 的自动装配模式将 User 对象注入到控制器中,然后将用户输入的用户名和密码与系统中限定的合法用户 ...
- 【撸码caffe 五】数据层搭建
caffe.cpp中的train函数内声明了一个类型为Solver类的智能指针solver: // Train / Finetune a model. int train() { -- shared_ ...
- php的string编码类型
在php中字符编码转换我们一般会用到iconv与mb_convert_encoding进行操作,但是mb_convert_encoding在转换性能上比iconv要差很多哦.string iconv ...
- C#方法的练习
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Demo ...
- Nginx作为负载均衡服务
负载均衡服务器配置: 注意:upstream和server同级 案例: 建立两个基于端口的虚拟主机来模拟两台web服务器. (1)新建一个www.123.com:81和www.123.com:82的虚 ...
- Quartz 表达式的学习
只记录用到过的,不全面 Quartz版本:quartz-all-1.6.0.jar 先看图 其他示例: 0 5,6,13 * * ? 意义:每日5:00,6:00,13:00 被触发 0 10,30 ...