java web 读取文件_JavaWeb基础: 获取资源文件

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

根据上下文把资源作为流读入

根据资源文件的相对路径获取其硬盘的绝对路径来读写资源文件。

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

资源文件在源代码包中:

InputStream in=servletA.getServletContext().getResourceAsStream("/WEB-INF/classes/packagesPath")

String absoluteFilePath=servletA.getServletContext().getRealPath("/WEB-INF/classes/packagesPath");

资源文件在resources文件夹下,因为Maven项目构建时会把resources文件也打包到classes目录下,读取方式同上。

资源文件在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类可以通过如下方法获取资源文件:

InputStream in=this.Class.getClassLoader().getResourceAsStream("packagesPath");

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

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值