java/web如何获取资源文件

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();
		}

发布了56 篇原创文章 · 获赞 1 · 访问量 1168

猜你喜欢

转载自blog.csdn.net/atu1111/article/details/105186434