zoukankan      html  css  js  c++  java
  • JavaWeb基础: 获取资源文件

    Web工程在编译构建完毕以后,需要部署到Tomcat上运行,资源的硬盘路径也会随着改变。要想对资源文件进行读写操作需要获取其硬盘地址,在Web工程中通常通过ServletContext/ClassLoader 来获取资源

    1. 根据上下文把资源作为流读入
    2. 根据资源文件的相对路径获取其硬盘的绝对路径来读写资源文件。

    Web工程中包括Servlet和普通的Java类,对于Servlet来说,可以获取ServletContext 从而得到程序部署时工作区的根目录,进尔找到对应资源的绝对路径,Web工程中的"/" 代表部署到Tomcat的工作区根目录,作为资源文件查找的起点:

    1. 资源文件在源代码包中:
      • InputStream in=servletA.getServletContext().getResourceAsStream("/WEB-INF/classes/packagesPath") 
      • String absoluteFilePath=servletA.getServletContext().getRealPath("/WEB-INF/classes/packagesPath");
    2. 资源文件在resources文件夹下,因为Maven项目构建时会把resources文件也打包到classes目录下,读取方式同上。
    3. 资源文件在Web应用WEB-INF目录下:
      • InputStream in=servletA.getServletContext().getResourceAsStream("/WEB-INF/XX") 
      • String absoluteFilePath=servletA.getServletContext().getRealPath("/WEB-INF/XX");

    对于普通的Java类,无法根据ServletContext获取应用根目录对应的实际硬盘地址,只能根据ClassLoader获取当前运行类(即编译后classes文件)所在的路径,因此资源文件必须存在于src/main/java或者是/src/main/resources 这些编译后处于classes目录下的文件夹中。ClassLoader提供了从classes 目录下查找资源的方法,因此对于普通Java类可以通过如下方法获取资源文件:

    1. InputStream in=this.Class.getClassLoader().getResourceAsStream("packagesPath");
    2. String absoluteFilePath=this.Class.getClassLoader().getResources("packagesPath").getPath();
    package servletContext;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Enumeration;
    import java.util.Properties;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     *Java工程中的资源或者是属性文件一般通过两种方式存储:.properties &.xml;对于没有数据结构的配置文件通常采用.properties,否则用xml
     *Java  提供Properties类来模拟以.properties 结尾的文件,通过加载文件流获取属性键值对,直接对属性进行处理
     *Java  提供Dom4j,SAXBuilder等工具类来处理XML的属性文件。
     *无论是properties文件还是xml文件,要对文件做处理,第一步就是要查找文件。Java通过绝对路径或者是相对路径来查找文件;因为JavaWeb工程是部署到Tomcat容器中运行的,开发的时候是不知道Web容器的目录情况,并且Web容器可能会变,因此WebProject中需要用相对路径来查找资源文件
     */
    
    public class FirstServletContextForResouceIndentify extends HttpServlet {
    	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    
    		// Case1:读取/src/main/java下的资源文件(资源文件会随着java类打包一起编译到classes当中,同一包下找资源文件和找Java类的路径一样
    		getResourcesUnderSrcFolder();
    
    		// Case2:读取处于WEB-INF根目录的文件,比如web.xml等全局性的配置文件。WEB-INF下的文件在部署时直接会编译到/WEB-INF/下
    		getResourceUnderWEBINF();
    
    		// Case3:读取处于/src/main/resources目录下的文件,resources包下的文件也会被打包到/WEB-INF/classes目录下;
    		getResourceUnderResourcesFolder();
    
    		// Case4:通过映射Web应用上的路径获取资源文件的真实硬盘路径,通常在上传下载文件时使用此方法。
    		getResourceByGetRealPath();
    
    		// Case5:使用类加载器加载资源文件:如果无法通过servletContext加载文件,就只能通过类加载器来加载文件,类加载器的原理
    		// 使用类加载器本质上是把文件当作静态代码加载到内存当中,因此文件不易过大,否则会造成内存崩溃。
    		 getResourceFromClassLoader();
    
    	}
    
    	// 采用getServletContext().getResourceAsStream("部署到Tomcat的引用根目录开始的资源路径” 返回流对象
    	// web应用的java代码会被编译到根目录下/WEB-INF/classes/package1/package2/.../java.classes
    	private void getResourcesUnderSrcFolder() throws IOException {
    		String path_javasrcfolder = "/WEB-INF/classes/servletContext/dbconn_javasrc.properties";
    		InputStream in_path_javasrcfolder = this.getServletContext().getResourceAsStream(path_javasrcfolder);
    		System.out.println("Get resouces from java src Folder-----------------------");
    		this.enumPropertiesByInputStream(in_path_javasrcfolder);
    	}
    
    	// Maven项目中会有专门的/src/main/resouces目录来存放各种配置文件:数据库Java映射文件,属性文件,项目全局性的配置文件通常还是存储/WEB-INF下,比如web-xml
    	// 这些配置文件在编译时会被和普通java类一样打包到WEB-INF/classes 目录下,因此resource包名要和源代码包名有一定区分
    	private void getResourceUnderResourcesFolder() throws IOException {
    		String path_resouces = "/WEB-INF/classes/com/vivian/demo/servletContext/dbconn_resources.properties";
    		InputStream in_path_resouces = this.getServletContext().getResourceAsStream(path_resouces);
    		System.out.println("Get resouces from resources Folder---------------------");
    		this.enumPropertiesByInputStream(in_path_resouces);
    	}
    
    	private void getResourceUnderWEBINF() throws IOException {
    		String path_WEBINF = "/WEB-INF/dbconn_webinf.properties";
    		InputStream in_path_WEBINF = this.getServletContext().getResourceAsStream(path_WEBINF);
    		System.out.println("Get resouces under WEBINF Folder--------------------------");
    		this.enumPropertiesByInputStream(in_path_WEBINF);
    	}
    
    	private void getResourceByGetRealPath() throws FileNotFoundException, IOException {
    		String path = this.getServletContext().getRealPath("/WEB-INF/classes/servletContext/dbconn_javasrc.properties");
    		InputStream in_fileInputStream = new FileInputStream(path);
    		System.out.println("Get resouces by first identify real path--------------------------");
    		this.enumPropertiesByInputStream(in_fileInputStream);
    	}
    	
    	
    	//通过classLoader.getResourceAsStream 或者是classloader.getResource(url).getPath两种方式都可以读到资源
    	//资源获取的关键是正确的URL,classLoader 查找资源的起点是编译后的classes目录,因此资源文件必须是打包进classes,而且从classes目录往下查找获取的
    	private void getResourceFromClassLoader() throws FileNotFoundException, IOException {
    		InputStream in_javaclassloader = this.getClass().getClassLoader().getResourceAsStream("servletContext/dbconn_javasrc.properties");
    		// String path=this.getClass().getClassLoader().getResource("servletContext/dbconn_javasrc.properties").getPath();
    		// FileInputStream in_javaclassloader=new FileInputStream(path);
    		 System.out.println("Get resources by classloader--------------------");
    		 this.enumPropertiesByInputStream(in_javaclassloader);
    	}
    
    
    	/*
    	 * properties文件也提供了很多的属性获取方法,可以遍历所有属性,可以获取某一个属性的对应值;通过properties来遍历值有以下几步
    	 * 1.新建Properties对象 2.prop.load(InputStream in) 3.prop.getProperty(String
    	 * name) 除了属性名得到属性值以外,properties对象还提供了遍历所有属性名的方法,它能以集合的形式管理其中所有属性文件的内容
    	 */
    	public void enumPropertiesByInputStream(InputStream in) throws IOException {
    		// 将文件流做为属性文件的输入
    		Properties prop = new Properties();
    		prop.load(in);
    		// 遍历属性文件中所有的键值对
    		String key, value;
    		Enumeration<?> eprop = prop.propertyNames();
    		while (eprop.hasMoreElements()) {
    			key = eprop.nextElement().toString();
    			value = prop.getProperty(key);
    			System.out.println("propName: " + key + " value: " + value);
    
    		}
    
    	}
    
    }
    

      

  • 相关阅读:
    三大主流负载均衡软件对比(LVS+Nginx+HAproxy)
    nginx 提示the "ssl" directive is deprecated, use the "listen ... ssl" directive instead
    centos安装nginx并配置SSL证书
    hadoop创建目录文件失败
    The server time zone value 'EDT' is unrecognized or represents more than one time zone.
    脚本启动SpringBoot(jar)
    centos做免密登录
    数据库远程连接配置
    Bash 快捷键
    TCP三次握手四次断开
  • 原文地址:https://www.cnblogs.com/vivian-test/p/5929315.html
Copyright © 2011-2022 走看看