版权声明:本文为博主原创文章,未经博主允许不得转载。 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. Hadoop2.2.0 注意事项

    1.启动前必须把防火墙关了,要不然会导致nodemanager启动不了. 关闭防火墙:service iptables stop 永久关闭(重启后默认关闭):chkconfig iptables of ...

  2. hdu_1009_FatMouse' Trade_201310280910

    FatMouse' Trade http://acm.hdu.edu.cn/showproblem.php?pid=1009 Time Limit: 2000/1000 MS (Java/Others ...

  3. mapreduce v1.0学习笔记

    它是什么? 一个用于处理大数据开源的分布式计算框架,它由java实现,原生提供java编程交互接口,其它语言通过hadoop streaming方式和mapreduce框架交互. 可以做什么? 利用框 ...

  4. poj 3468 A Simple Problem with Integers(线段树+区间更新+区间求和)

    题目链接:id=3468http://">http://poj.org/problem? id=3468 A Simple Problem with Integers Time Lim ...

  5. 分享微软官方Demo用的SharePoint 2010, Exchange 2010, Lync 2010虚拟机

    微软官方有一套专门用于SharePoint 2010, Exchange 2010 Demo的虚拟机:SharePoint 2010: Information Worker Demonstration ...

  6. windows下solr7.9+tomcat7环境搭建

    1.下载solr.tomcat(能够不用下载.由于solr有jetty支持) 2.solr部署到tomcat上    首先,把解压包下的solr-4.9.0\example\solr-webapp中的 ...

  7. Spring学习笔记——Spring事务仅仅对执行时异常回滚

    我们在使用Spring时候一般都知道事务在遇到异常的时候会回滚.岂不知Spring的事务默认仅仅有在发生执行时异常即:RunTimeException时才会发生事务,假设一个方法抛出Exception ...

  8. android按钮被点击文字颜色变化效果

    有的时候做应用需要点击按钮时文字颜色也跟着变,松开后又还原,目前发现两种解决方案:第一用图片,如果出现的地方比较多,那么图片的量就相当可观:第二,也就是本文讲到的.废话少说,先贴图片,再上代码. 正常 ...

  9. ES transport client批量导入

    从bulk.txt文件中按行读取,然后bulk导入.首先通过调用client.prepareBulk()实例化一个BulkRequestBuilder对象,调用BulkRequestBuilder对象 ...

  10. bzoj4241 历史研究——分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4241 就是分块,预处理出从第 i 块到 j 位置的答案,以及从第 i 块到最后位置间每个数出 ...