java如何获取资源文件
java开发中,常见的resource文件有:.xml,.properties,.txt文件等,后台开发中经常用到读取资源文件,处理业务逻辑,然后返回结果。
获取资源文件的方法有:
1.getResource()返回:URL
2.getResourceAsStream () 返回的是inputstream,需要定义一个InputStream接收
getResource和Class.getResourceAsStream在使用时,路径选择上是一样的。相当于你用getResource()取得File文件后,再new InputStream(file)一样的结果,所以这里我们只介绍 getResource()。
1.本类的class类的getResource方法
path不以’/'开头时,默认是从此类所在的包下取资源;
path 以’/'开头时,则是从ClassPath根下获取;
1.1 java工程getResource方法获取资源路径
//Classpath根路径
String path = Test.class.getResource("/").getPath();
// /C:/code/study/java/resource/bin/
System.out.println(path);
URL url = Test.class.getResource("test.txt");
System.out.println(url.getPath());// /C:/code/study/java/resource/bin/com/personal/test/test.txt
URL url2 = Test.class.getResource("/com/personal/test/test.txt");
System.out.println(url2.getPath());// /C:/code/study/java/resource/bin/com/personal/test/test.txt
1.2 web工程getResource方法获取资源路径
//Classpath根路径
String path = Test.class.getResource("/").getPath();
System.out.println(path);// /C:/code/study/java/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/resourceWeb/WEB-INF/classes/
URL url = Test.class.getResource("test.txt");
System.out.println(url.getPath());// /C:/code/study/java/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/resourceWeb/WEB-INF/classes/com/personal/test/test.txt
URL url2 = Test.class.getResource("/com/personal/test/test.txt");
System.out.println(url2.getPath());// /C:/code/study/java/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/resourceWeb/WEB-INF/classes/com/personal/test/test.txt
2.通过本类的ClassLoader的getResource方法
path不能以’/'开头,path是从ClassPath根下获取;
所以可以认为:类名.class.getResource("/") == 类名.class.getClassLoader().getResource("")
//Classpath根路径
URL url3 = Test.class.getClassLoader().getResource(""); // == Test.class.getResource("/").getPath()
System.out.println(url3.getPath());// /C:/code/study/java/resource/bin/
URL url4 = Test.class.getClassLoader().getResource("com/personal/test/test.txt");
System.out.println(url4.getPath());// /C:/code/study/java/resource/bin/com/personal/test/test.txt
3.通过ClassLoader的getSystemResource(),路径和2一致
path不能以’/'开头,path是从ClassPath根下获取;
所以可以认为:类名.class.getResource("/") == 类名.class.getClassLoader().getResource("")
//Classpath根路
URL url5 = ClassLoader.getSystemResource("");// == Test.class.getResource("/").getPath()
System.out.println(url5.getPath());// /C:/code/study/java/resource/bin/
URL url6 = ClassLoader.getSystemResource("com/personal/test/test.txt");
System.out.println(url6.getPath());// /C:/code/study/java/resource/bin/com/personal/test/test.txt
4.通过Thread方式,路径和2一致(推荐此种),Thread.currentThread().getContextClassLoader()
为什么推荐此类?
Test.class.getClassLoader().getResource,因为你想要获取某个资源文件的时候,这个资源文件的位置是相对固定的。
WEB程序,里面的jar、resources都是由Tomcat内部来加载的,所以你在代码中动态加载jar、资源文件的时候,首先应该是使用Thread.currentThread().getContextClassLoader()。
如果你使用Test.class.getClassLoader(),可能会导致和当前线程所运行的类加载器不一致(因为Java天生的多线程)
//Classpath根路径
URL url7 = Thread.currentThread().getContextClassLoader().getResource("");
System.out.println(url7.getPath());// /C:/code/study/java/resource/bin/
URL url8 = ClassLoader.getSystemResource("com/personal/test/test.txt");
System.out.println(url8.getPath());// /C:/code/study/java/resource/bin/com/personal/test/test.txt
5.提示
创建File文件,通过路径来读取文件内容。
对于打包到jar文件中的资源文件,则不能通过上面的getResource方法获取文件路径创建File文件了,但可以通过Class类的getResourceAsStream()方法来获取
InputStream ins = Test.class.getResourceAsStream("test.txt");
byte[] bbuf = new byte [1024];
int hasRead = 0;
try {
while ( (hasRead = ins.read(bbuf)) > 0 )
{
System.out.println(new String (bbuf, 0, hasRead));//hello world
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
web如何获取资源文件
ServletContext. getResourceAsStream(String path):默认从WebAPP根目录下取资源,Tomcat下path是否以’/'开头无所谓
ServletContext servletContext = request.getServletContext();
System.out.println( servletContext.getResource("/").getPath());// /localhost/resourceWeb/
System.out.println( servletContext.getResource("").getPath());// /localhost/resourceWeb/
InputStream ins = servletContext.getResourceAsStream("test.txt");
byte[] bbuf = new byte [1024];
int hasRead = 0;
try {
while ( (hasRead = ins.read(bbuf)) > 0 )
{
System.out.println(new String (bbuf, 0, hasRead));//hello world
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}