`
liyanhui
  • 浏览: 350651 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

getResourceAsStream()读取取资源文件的探讨

    博客分类:
  • java
阅读更多

首先是this.getClass().getClassLoader().getResourceAsStream()的问题。

1. java.lang.NoClassDefFoundError: org/jaxen/JaxenException
 at org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230)
 at org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207)
 at org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:164)
 at com.classLoader.resource.BinaryServiceManager.initialMapping(BinaryServiceManager.java:39)
 at com.classLoader.resource.BinaryServiceManager.refresh(BinaryServiceManager.java:68)
 at com.classLoader.resource.BinaryServiceServlet.doGet(BinaryServiceServlet.java:10)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
 at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
 at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
 at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
 at java.lang.Thread.run(Thread.java:595)
原因: 没有导入jaxen包,一般情况下,dom4j-1.6.1.jar和jaxen-1.1.1.jar要同时使用,后者是前者的基础包。

2, 源代码:

package com.classLoader.resource;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class BinaryServiceManager {
 
 private HashMap<String, String> binaryMap = null;
 
 private static BinaryServiceManager instance = null;
 
 private BinaryServiceManager() {}
 
 public static BinaryServiceManager getInstance() {
  if (instance == null) {
   instance = new BinaryServiceManager();
  }
  return instance;
 }
 
 private void initialMapping() {
  HashMap<String, String> tempBinaryMap = new HashMap<String, String>();
  Document doc = null;
  try {
   SAXReader reader = new SAXReader();
   doc = reader.read(this.getClass().getClassLoader().getResourceAsStream("BinaryServiceMapping.xml"));
   System.out.println(this.getClass().getClassLoader().getResourceAsStream("BinaryServiceMapping.xml"));
   List binaryServiceList = doc.selectNodes("/binaryServiceMapping/binaryService");
   Node binaryServiceInfo = null;
   for (int i = 0; i < binaryServiceList.size(); i++) {
    binaryServiceInfo = (Node) binaryServiceList.get(i);
    String shortCode = binaryServiceInfo.selectSingleNode("./shortCode").getText();
    List serviceList = binaryServiceInfo.selectNodes("./services/service");
    List carrierList = binaryServiceInfo.selectNodes("./carriers/carrier");
    for (int j = 0; j < serviceList.size(); j++) {
     Node serviceInfo = (Node) serviceList.get(j);
     String serviceId = serviceInfo.selectSingleNode("./serviceId").getText();
     String serviceName = serviceInfo.selectSingleNode("./serviceName").getText();
     for (int k = 0; k < carrierList.size(); k++) {
      Node accountInfo = (Node) carrierList.get(k);
      String carrierId = accountInfo.selectSingleNode("./carrierId").getText();
      String carrierName = accountInfo.selectSingleNode("./carrierName").getText();
      String key = shortCode + "::" + serviceId + "::" + carrierId;
      System.out.println("shortCode=" + shortCode + " serviceId=" + serviceId + " carrierId=" + carrierId);
      System.out.println("key=" + key);
      tempBinaryMap.put(key, shortCode);
     }     
    }
   }
   binaryMap = tempBinaryMap;
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 
 public void refresh() {
  initialMapping();  
 }
}
当刷新xml文件时,总是刷新失败,即使把classes下面的xml文件删除,  this.getClass().getClassLoader().getResourceAsStream()仍能读取到数据,并且数据和服务启动时读取到的数据完全一样,查看了源代码,发现this.getClass().getClassLoader().getResourceAsStream()首先从java虚拟机中查找文件,如果找不到,再按文件路径查找,找到后放到虚拟机中,也就是说第一次读取的时候已经把文件放到Java虚拟机中了,所以再读取的时候,直接从虚拟机中读取,所以,不能刷新成功。 修改代码 doc = reader.read(this.getClass().getClassLoader, 修改代码如下,

InputStream input = null;
   String path = this.getClass().getClassLoader().getResource(File.separator).getPath();
   input = new FileInputStream(new File(path + File.separator + "BinaryServiceMapping.xml"));
   doc = reader.read(input);

此时报了一个错误,

java.io.FileNotFoundException: F:\program%20files\tomcat-5.5.23\webapps\Agaro_4_0_Problem\WEB-INF\classes\BinaryServiceMapping.xml (系统找不到指定的路径。)
 at java.io.FileInputStream.open(Native Method)
 at java.io.FileInputStream.<init>(FileInputStream.java:106)
 at com.classLoader.resource.BinaryServiceManager.initialMapping(BinaryServiceManager.java:35)
 at com.classLoader.resource.BinaryServiceManager.refresh(BinaryServiceManager.java:68)
 at com.classLoader.resource.BinaryServiceServlet.doGet(BinaryServiceServlet.java:10)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
 at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
 at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
 at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
 at java.lang.Thread.run(Thread.java:595)

发现这样的写法系统不认空格键,也就是说文件夹的命名不能有空格键,把有空格的文件名的空格去掉,则能成功刷新xml文件。

 

 

 

分享到:
评论

相关推荐

    java 读取资源文件

    本文将深入探讨如何使用Java读取资源文件,特别是properties类型的文件。 资源文件通常存储在项目的类路径(classpath)下,可以是.properties、.txt、.xml等形式,它们提供了与代码分离的配置选项。对于....

    java读取资源文件

    在这个场景下,我们将深入探讨如何在IntelliJ IDEA(Idea)环境中读取资源文件,特别是针对读取图片进行详细说明。 首先,我们需要了解Java类路径的概念。Java类路径是Java虚拟机(JVM)查找类和资源的路径。当项目...

    Properties读取资源文件经典应用

    本篇文章将详细探讨如何使用Properties类来读取资源文件,以及在实际应用中的安全检查。 首先,我们需要了解`Properties`类的基本用法。`java.util.Properties`继承自`Hashtable`,它提供了一种存储和检索配置参数...

    读取war包或jar包内的文件

    5. **使用第三方库**: 有些库,如Apache Commons IO或Spring框架,提供了更高级的工具来处理资源读取,简化了从归档文件中获取资源的操作。 6. **实战示例**: - `TestWarAndJar1.java`可能包含了一个简单的示例,...

    读取jar文件

    2. **使用`getResourceAsStream`方法**:此方法直接返回一个`InputStream`对象,可以用来读取资源文件的内容。 #### 四、常见问题与解决方案 1. **资源文件无法找到**: - 检查资源文件的路径是否正确,特别是是否...

    如何读取webroot文件下的属性文件

    在本文中,我们将详细探讨如何在Java Web环境中读取`webroot`文件下的属性文件。 1. **属性文件结构** 属性文件是键值对的简单文本格式,每一行代表一个键值对,以等号`=`或冒号`:`分隔键和值。例如: ``` ...

    java 读取properties文件代码

    下面我们将详细探讨如何在Java中读取Properties文件。 首先,你需要确保你的项目中包含了一个Properties文件,比如`config.properties`。这个文件可以手动创建,也可以通过IDE自动生成。文件内容可能如下: ``` ...

    java读取配置文件(axun)

    在本案例中,我们将探讨如何在Java中读取配置文件,以实现`axun`的功能。 首先,我们需要了解配置文件的格式。在Java中,最常用的配置文件格式是`.properties`。这些文件包含了键值对,例如`key=value`的形式,便于...

    读取yml文件工具类.zip

    下面,我们将深入探讨如何在Java中实现一个YAML文件读取工具类,并介绍相关的技术点。 首先,我们需要引入一个能够处理YAML文件的库。在Java中,SnakeYAML是一个广泛使用的开源库,它可以解析和生成YAML文档。在你...

    Java读取.properties文件

    对于大型项目,推荐使用类加载器来读取资源文件,这样可以避免因绝对路径导致的问题。这里是如何使用类加载器读取`.properties`文件的示例: ```java InputStream is = TestProperties.class.getResourceAsStream(...

    Jar包中如何正确地加载资源文件博文中用到的测试项目源码

    本篇文章将详细探讨如何在Java中正确地从JAR包中加载资源文件,并提供相应的源码示例。 首先,理解Java类路径(classpath)是关键。类路径是指Java虚拟机(JVM)查找.class文件和其他资源文件的路径。当你运行一个...

    java 静态代码块通过类加载器获取资源文件例子

    因为静态代码块只执行一次,所以这种方式避免了每次创建类实例时都去读取资源文件的开销。例如: ```java public class AppConfig { static { InputStream inputStream = AppConfig.class.getResourceAsStream("/...

    解决SpringBoot jar包中的文件读取问题实现

    在开发SpringBoot微服务时,开发人员小明遇到了一个问题,即在本地开发环境中能够正常读取资源文件,如word文档或模板,但当项目被打包成jar并部署到服务器后,程序无法找到这些文件,导致运行时异常。这个问题在...

    java Properties文件key,value读取

    // 使用类路径下资源文件的路径 InputStream input = PropertiesReader.class.getResourceAsStream("/config.properties"); // 加载Properties文件 props.load(input); // 读取并打印Properties文件中的键值...

    java读取properties文件

    本篇文章将深入探讨如何在Java中读取`properties`文件,无需依赖任何第三方库。 首先,我们需要了解Java的标准库中提供的`java.util.Properties`类。这个类提供了一种存储和加载属性列表的方法,它能够处理`....

    资源文件操作

    下面我们将深入探讨如何管理和使用资源文件,以及如何直接播放其中的音乐。 首先,理解资源文件的分类。资源文件通常分为两种类型:嵌入式资源和外部资源。嵌入式资源是将文件直接包含在程序集或应用程序中,例如在...

    详解Java项目中读取properties文件

    本文将详细介绍几种在Java中读取properties文件的方法,并探讨在不同场景下的适用性。 首先,最常用的读取properties文件的方法是利用`java.lang.Class`类的`getResourceAsStream(String name)`方法。例如: ```...

    JAVA读取properties文件的值

    使用资源文件 在大型项目中,通常将配置文件放入类路径(classpath)中。此时,使用`ClassLoader`来获取输入流: ```java InputStream input = getClass().getClassLoader().getResourceAsStream("config....

    Java那些事儿之(一)读取property配置文件

    在实际项目中,资源文件通常位于类路径下。可以使用`ClassLoader`来加载这些文件,如下所示: ```java InputStream is = getClass().getResourceAsStream("/config.properties"); Properties props = new ...

    Java程序中的配置文件的存放和读取[文].pdf

    例如,我们可以获取`ConnectionPool`类的类加载器,然后根据类的包路径定位到`database.properties`,并通过`getResourceAsStream()`方法读取文件内容。伪代码如下: ```java ClassLoader loader = ConnectionPool....

Global site tag (gtag.js) - Google Analytics