直接将需要的文件上传到服务器指定的文件夹下,如果把文件路径写死,就太low了,也不符合编码规范。而且存在各种隐患例如:不同的环境发布到不同的服务器上,开发一个服务器,测试一个服务器,生产一个服务器,每个服务器中都要上传一份;如果误删或者迁移项目忘记迁移这个文件就麻烦了;
Class.getResource和ClassLoader.getResource本质上是一样的,都是使用ClassLoader.getResource加载资源的。
同样先获取文件的路径,path不以’/'开头时,首先通过双亲委派机制,使用的逐级向上委托的形式加载的,最后发现双亲没有加载到文件,最后通过当前类加载classpath根下资源文件。
我们都知道 Java 文件被运行,第一步,需要通过 javac
编译器编译为 class 文件;第二步,JVM 运行 class 文件,实现跨平台。
而 JVM 虚拟机第一步肯定是 加载 class 文件,所以,类加载器实现的就是(来自《深入理解Java虚拟机》):
通过一个类的全限定名来获取描述此类的二进制字节流
类加载器有几个重要的特性:
3.1 双亲委派模型
通过双亲委派模型就实现了类加载器的三个特性:
委派(delegation):子类加载器委派给父类加载器加载;
可见性(visibility):子类加载器可访问父类加载器加载的类,父类不能访问子类加载器加载的类;
唯一性(uniqueness):可保证每个类只被加载一次,比如 Object
类是被 Bootstrap ClassLoader 加载的,因为有了双亲委派模型,所有的 Object 类加载请求都委派到了 Bootstrap ClassLoader,所以保证了只被加载一次。
3.2 Java 中的类加载器
从 JVM 虚拟机的角度来看,只存在两种不同的类加载器:
而绝大多数 Java 应用都会用到如下 3 中系统提供的类加载器:
- 启动类加载器(Bootstrap/Primordial/NULL ClassLoader):顶层的类加载器,没有父类加载器。负责加载 /lib 目录下的,或则被 -Xbootclasspath 参数所指定路径中的,
并被 JVM 识别的(仅按文件名识别,如 rt.jar,名字不符合的类库即使放在 lib 目录也不会被加载)类库加载到虚拟机内存中。所有被 Bootstrap classloader 加载的类,
它的 Class.getClassLoader 方法返回的都是 null,所以也称作 NULL ClassLoader。
-
扩展类加载器(Extension CLassLoader):由 sun.misc.Launcher$ExtClassLoader
实现,负责加载 <JAVA_HOME>/lib/ext
目录下,或被 java.ext.dirs
系统变量所指定的目录下的所有类库;
-
应用程序类加载器(Application/System ClassLoader):由 sun.misc.Launcher$AppClassLoader
实现。它是 ClassLoader.getSystemClassLoader() 方法的默认返回值,
所以也称为系统类加载器(System ClassLoader)。它负责加载 classpath 下所指定的类库,如果应用程序没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。
如下,就是 Java 程序中的类加载器层级结构图:
最近有个需求,就是需要从resource目录下读取文件返回给用户。在idea中运行时,有些resource下文件读取工具类能够正常获取读取到文件。但是通过java –jar的方式去运行jar包,此时resource下文件读取工具类读取文件就失效了。通过查询搜索,了解到了是读取的方式导致文件读取失败。
Reflection(反射)是被视为动态语言的关键,反射机制允许程序在运行期间借助于 Reflection API 取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。加载完类之后,在堆内存的方法区中就产生了一个 Class 类型的对象(一个类只有一个 Class 对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。反射。Java 反射机制提供的功能:• 在运行时判断任意一个对象所属的类• 在运行时构造任意一个类的对象。
getResource是java.lang.Class的方法,也就是由字节码对象调用。
getResource接受一个字符串参数,如果以”/”开头,就在classpath根目录下找(不会递归查找子目录),如果不以”/”开头,就在调用getResource的字节码对象所在目录下找(同样不会递归查找子目录)。
概念理解:classpath,指的是编译后的class文件、xml、properties...
今天使用Java进行XML文件读取时,一直爆系统找不到指定的路径的问题,网上的方法看了个遍,都没有找到解决方案。最后发现我犯了一个非常简单的小错误。可能大家的错误都不一样,在看解决办法之前,望大家先看一下我犯的错误,如果我们犯的一样,那就很容易解决了
我的错误:
存储文件的文件夹的名称采用了中文命名。只需要把名称换成英文即可。大家如果跟我犯的一样,只需要改一下文件夹的名称就可以了。
package jsoup;
import org.jsoup.Jsoup;
import org.j
http://imsnoweagle.blog.sohu.com/108074172.html
JAVA里面对于类进行调用配置资源的文件数据,以this.getClass().getResourceAsStream()来读取比较合适。
路径采用相对路径直接可以从工程的path路径去找。主要问题是如果类中采用的是静态块的话,则该this.getClass()报错,因为读静态块时,可能该对象并为构
getClass().getResource()与getClassLoader().getResource()的区别
文章目录getClass().getResource()与getClassLoader().getResource()的区别简介测试结果Resources资源目录最终的问题总结
项目中我们经常要获取资源路径,我们会使用类名.getClass().getResource()和getClassLoader().getResource()。这两个经常乱用,用着用着就迷了,
有些时候路径获取的
Java 使用getClass().getResourceAsStream()方法获取资源Java 使用getClass().getResourceAsStream()方法获取资源之前想获取一个资源文件做一些处理,使用getClass().getResourceAsStream()一直拿不到文件。 具体的用法。1 InputStream is = this.getClass().getResour...
this.getClass().getClassLoader().getResourceAsStream("config/jdbc.properties");可以读取到配置文件里的内容。
this.getClass().getResourceAsStream("jdbc.properties");读取为空。
所以:项目可以编译
排除掉网上的这个错:
Java中取资源时,经常用到Class.getResource和ClassLoader.getResource,这里来看看他们在取资源文件时候的路径问题。
获取方式有4种(类/类对象是否调取ClassLoader)
1.通过类.class.getResource()
2.通过类.class.getClassLoader().getResource()
3.通过类对象.getClass().getClassLoader()
4.通过类对象.getClass().getResource()
文件在工程中的位置这
<value>classpath*:/application.properties</value>
<value>classpath:/application.properties</value>
这里的classpath怎么理解呢,其实指的就是根目录,关于根目录,需要了解:
1、src不是c...
用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大常最经常用的,就是用JAVA的File类,如要取得c:/test.txt文件,就会这样用File file = new File(“c:/test.txt”);这样用有什么问题,相信大家都知道,就是路径硬编码,对于JAVA精神来说,应用应该一次成型,到处可用,并且从现实应用来讲,最终生成的应用也会部署到Wi