四种常见的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 ;
}
}