Sax 中 getResourceAsStream 读取src目录下以及WEB-INF目录下的XML写法

四种常见的XML解析方法,分别为:DOM、SAX、JDOM、Dom4j。


一、getResourceAsStream用法
首先,Java中的getResourceAsStream有以下几种:
 
1. Class.getResourceAsStream(String path) :
path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从 ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。  
 
2. Class.getClassLoader.getResourceAsStream(String path) :
默认则是从ClassPath根下获取,path不能以’/'开头,最终是由   ClassLoader获取资源。
  
3. ServletContext. getResourceAsStream(String path):
默认从WebAPP根目录下取资源,Tomcat下path是否以’/'开头无所谓,   当然这和具体的容器实现有关。
  
4. Jsp下的application内置对象就是上面的ServletContext的一种实现。  


其次,getResourceAsStream 用法大致有以下几种:


例子1:读取src目录下的xml文件:
 
  第一: 要加载的文件和.class文件在同一目录下,例如:com.x.y 下有类me.class ,同时有资源文件myfile.xml 那么,应该有如下代码:
 
Java代码 
me.class.getResourceAsStream("myfile.xml");  
 
  第二:在me.class目录的子目录下,例如:com.x.y 下有类me.class ,同时在 com.x.y.file 目录下有资源文件myfile.xml   那么,应该有如下代码:
 
Java代码 
me.class.getResourceAsStream("file/myfile.xml");  
 
  第三:不在me.class目录下,也不在子目录下,例如:com.x.y 下有类me.class ,同时在 com.x.file 目录下有资源文件myfile.xml   那么,应该有如下代码:
  
Java代码 

   1、InputStream stream = new Test().getClass().getClassLoader().getResourceAsStream("xml/sax/student.xml");

   2、 InputStream stream = Test.class.getClassLoader().getResourceAsStream("xml/sax/student.xml");

两者本质上都是从src根目录开始读取。


例子2:读取WEB-INF目录下的xml文件:
  第一:ServletContext. getResourceAsStream(String path):理论上读取是从web-inf下开始的,但是经过测试,始终提示找不到文件,所以我变相加了一些内容。
 
  Java代码 
  1、   File file = new File("D:/apache-tomcat-6.0.45-windows-x86/apache-tomcat-6.0.45/webapps/DreamFactory/WEB-INF/student.xml");
          InputStream is = new FileInputStream(file);
  2、  File file = new File(LisServerPath.getInstance().getWebPath() + "/student.xml");
          InputStream is = new FileInputStream(file);

第一,ServletContext.class.getResourceAsStream( "student.xml");找不到相应内容,那么只能套接一个file类,通过绝对路径,找到相应了xml文件,然后再将file文件
转换成InputStream字节流。
第二,有的人会认为直接写地址这种方式很low,所以我们可以变相改变一下策略,根据ServletContext加载时,找到web-inf的路径,再加上你要找的xml就可以读取了。

以下是第二种的实现:

步骤一、
web.xml中配置监听器
 
 listener.LisContextListener
 

步骤二、
package listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class LisContextListener implements ServletContextListener {

 public void contextDestroyed(ServletContextEvent cEvent) {
  // TODO Auto-generated method stub

 }

 public void contextInitialized(ServletContextEvent cEvent) {
  // TODO Auto-generated method stub
  LisServerPath.getInstance().loadServerPath(cEvent.getServletContext());
 }

}

步骤三、
package listener;

import javax.servlet.ServletContext;

/**
 * 仅存储系统路径
 */
public final class LisServerPath
{
 /**获取应用服务路径
  * 获取结果例如:D:/jboss-eap-4.3/jboss-as/server/default/./deploy/ui.war'
  * D:/apache-tomcat-6.0.45-windows-x86/apache-tomcat-6.0.45/webapps/DreamFactory
  * */
    private String realPath="";
   
    /**获取应用服务WEB-INF路径
  * 获取结果例如:D:/jboss-eap-4.3/jboss-as/server/default/./deploy/ui.war/WEB-INF
  * D:/apache-tomcat-6.0.45-windows-x86/apache-tomcat-6.0.45/webapps/DreamFactory/WEB-INF
  * */
    private String webPath="";
   
    /**获取应用服务classes路径
  * 获取结果例如:D:/jboss-eap-4.3/jboss-as/server/default/./deploy/ui.war/WEB-INF/classes
  * D:/apache-tomcat-6.0.45-windows-x86/apache-tomcat-6.0.45/webapps/DreamFactory/WEB-INF/classes
  * */
    private String classPath="";
   
    public static LisServerPath mLisServerPath =null;
   
    private LisServerPath()
    {
    }
    public static LisServerPath getInstance()
    {
     if(mLisServerPath == null)
     {
      mLisServerPath = new LisServerPath();
     }
     return mLisServerPath;
    }
  
    protected void loadServerPath(ServletContext cServletContext)
    {
     if ("".equals(realPath))
     {
      realPath=cServletContext.getRealPath("").replace("\\", "/");
     }
     if ("".equals(webPath))
     {
      webPath=realPath+"/WEB-INF";
     }
     if ("".equals(classPath))
     {
      classPath=realPath+"/WEB-INF/classes";
     }
    }
   
    public String getRealPath()
 {
  return realPath;
 }

    public String getWebPath()
 {
  return webPath;
 }
    public String getClassPath()
    {
     return classPath;
    }

    /**获取运行类所在路径
     * 例如运行类为:com.sinosoft.lis.bank.WagePayReadFromFileBL.class
     * 则调用该方法获取路径为:D:/jboss-eap-4.3/jboss-as/server/default/./deploy/ui.war/WEB-INF/classes/com/sinosoft/lis/bank
     * 此方法只支持class,不支持ui*/
 public String getRuntimePath()
    {
     String runtimePath = "";
     String packagePath = "";
    
     Exception ex = new RuntimeException();
     try
     {
         StackTraceElement e2= ex.getStackTrace()[1];
      packagePath = e2.toString();
      System.out.println("packagePath="+packagePath);
         packagePath = packagePath.substring(0,packagePath.lastIndexOf("("));
         packagePath = packagePath.substring(0,packagePath.lastIndexOf("."));
         //处理java/src下的无包文件
         if(packagePath.indexOf(".")==-1)
         {
          return LisServerPath.getInstance().getClassPath();
         }
         packagePath = packagePath.substring(0,packagePath.lastIndexOf("."));
         packagePath = packagePath.replace(".", "/");
     }
     catch(IndexOutOfBoundsException e)
     {
      e.printStackTrace();
     }
     catch(NullPointerException e)
     {
      e.printStackTrace();
     }
     runtimePath = LisServerPath.getInstance().getClassPath()+"/"+ packagePath;
     System.out.println("runtimePath="+runtimePath);
        return runtimePath ;      
    }
}


你可能感兴趣的:(Sax 中 getResourceAsStream 读取src目录下以及WEB-INF目录下的XML写法)