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

  

JavaWeb基础: 获取资源文件的更多相关文章

  1. java基础知识3--如何获取资源文件(Java中获取资源文件的url)

    java开发中,常见的resource文件有:.xml,.properties,.txt文件等,后台开发中经常用到读取资源文件,处理业务逻辑,然后返回结果. 获取资源文件的方法说明getResourc ...

  2. 【Spring】获取资源文件+从File+从InputStream对象获取正文数据

    1.获取资源文件或者获取文本文件等,可以通过Spring的Resource的方式获取 2.仅有File对象即可获取正文数据 3.仅有InputStream即可获取正文数据 package com.sx ...

  3. wpf 前台获取资源文件路径问题

    1 <ImageBrush ImageSource="YT.CM.CommonUI;component/Resource/FloadwindowImage/middle.png&quo ...

  4. 关于获取资源文件,Class.getResource和ClassLoader.getResource的区别

    原文同步发表至个人博客[夜月归途] 原文链接:http://www.guitu18.com/se/java/2019-02-22/29.html 作者:夜月归途 出处:http://www.guitu ...

  5. Java中获取资源文件的方法总结

    这里总结3中方法获取资源文件的 ServletContext Class ClassLoader 文件的位置 1. ServletContext public void doGet(HttpServl ...

  6. 【spring Boot】spring boot获取资源文件的三种方式【两种情况下】

    首先声明一点,springboot获取资源文件,需要看是 1>从spring boot默认的application.properties资源文件中获取 2>还是从自定义的资源文件中获取 带 ...

  7. web项目获取资源文件

    首页 博客 学院 CSDN学院 下载 论坛 APP CSDN 问答 商城 活动 VIP会员 专题 招聘 ITeye GitChat GitChat 图文课 写博客 消息 1 评论 关注 点赞 回答 系 ...

  8. Java/JavaWeb中读取资源文件

    1.一般工程中使用I/O类指定文件的绝对路径读取 FileInputStream fis = new FileInputStream("src/main/resources/zsm.prop ...

  9. Android反编译获取资源文件-android学习之旅(69)

    有时候你看到一些很好看的布局,会考虑别人怎么实现的,回想参考一下,那么这时候反编译一下是很必要的. 要用到的工具apktool.bat和aapt.exe和apktool.jar(要最新版本) 下载前两 ...

随机推荐

  1. 【Android测试】【第十二节】Uiautomator——API详解

    ◆版权声明:本文出自carter_dream的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/4921701.html 简单的例子 以一个 ...

  2. vim - Putting the current file on the Windows clipboard

    http://vim.wikia.com/wiki/VimTip432 command! Copyfile let @*=substitute(expand("%:p"), '/' ...

  3. 20145320《Java程序设计》第二次实验报告

    20145320<Java程序设计>第二次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.04.12 15: ...

  4. ucos 学习

    1.UCOSII 早期版本只支持 64 个任务,但是从 2.80 版本开始,支持任务数提高到 255 个,不过对我们来说一般 64 个任务都是足够多了,一般很难用到这么多个任务. UCOSII 保留了 ...

  5. javascript的语法结构

    字符规范: javascript程序是采用的Unicode字符集编写的,并且区分大小写.但是html代码不区分大小写,比如,在html中点击事件就可以写成onClick或则onclick,但是在jav ...

  6. Dynamics AX 2012 R3 Demo 安装与配置 - 编译和配置 (Step 3)

        在前两节中,Reinhard主要讲解了如何配置安装环境,安装数据库服务器,AOS和客户端.至此安装工作已经结束,下面Reinhard开始讲解如何编译和配置.     运行客户端后,系统弹出初始 ...

  7. 33、mybatis(二)

    第十六章回顾SQL99中的连接查询 1)内连接 2)外连接 3)自连接 第十七章回顾hibernate多表开发 1)一对一 2)一对多 3)多对多 第十八章 mybatis一对一映射[学生与身份证] ...

  8. Response.Clear()和Response.ClearContent()区别

    Response.Clear()方法 Clear方法删除所有缓存中的HTML输出.但此方法只删除Response显示输入信息,不删除Response头信息. Response.ClearContent ...

  9. bat 命令分行写

    myprog parameter parameter parameter parameter parameter parameter parameter parameter parameter par ...

  10. Python进程、线程、协程

    进程和线程的解释 进程(process)和线程(thread)是操作系统的基本概念,计算机的核心是CPU,它承担了所有的计算任务: 单个CPU一次只能运行一个任务,代表单个CPU总是运行一个进程,其他 ...