log4j用于读取.xml文件的出现了错误,类加载器.getResource("user.xml").getPath()返回路径空格变成了%20...

本文讨论了在Java中使用XML文件作为模拟数据库时遇到的问题,即路径解析中的编码错误。通过引用官方建议的方法,即使用URI类来解码路径,作者成功解决了这一问题。文章还提供了替代方法,包括通过ClassLoader.getResourceAsStream()、Class.getResourceAsStream()和ResourceBundle.getBundle()获取文件流,以避免依赖于特定路径格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在训练web的三层开发模式,写了一个小程序,为了模拟数据库,用了xml来进行存放数据,因此需要将xml文件装载到内存中去,代码如下

    private static String fileName;
    static {
       fileName=XmlUtils.class.getClassLoader().getResource("user.xml").getPath(); 
    }

采用上面的方法进行获取该文件的物理路径。

一运行出现了下面的错误

java.lang.RuntimeException: org.dom4j.DocumentException:

    D:\Workspaces\MyEclipse%208.6\UserModel\WebRoot\WEB-INF\classes\user.xml (系统找不到指定的路径。)

    Nested exception: D:\Workspaces\MyEclipse%208.6\UserModel\WebRoot\WEB-INF\classes\user.xml (系统找不到指定的路径。)

 

将fileName内容输出,发现有个地方很特别,那就是%20,进入路径一看,原来我的workspace中存在一个空格。这导致错误。

下面来自http://www.cumt.org/blog/493里的内容:

"经过一番调查,原来是这是 Java 的一个历史悠久的 bug:

Bug ID: 4466485 getClass( ).getResource( ).getFile( ) returns file name with %20

此 bug 于 2001年6月被提出来,2002年11月最终关闭。
没有修复的原因是这样做会导致兼容性问题。
官方给出的解决方法是采用URI类再把它解码出来。

 URI uri = new URI(url.toString());
 FileInputStream fis = new FileInputStream(uri.getPath());

而这个bug是当初为了修复另一个 bug 的时候引入的:

Bug ID: 4359123 NoClassDefFoundError if ‘#’ anywhere in path

我们最终决定不用这个拐弯抹角的方法,干脆采用下面几种办法直接取得 Stream。

ClassLoader.getResourceAsStream ("some/pkg/resource.properties");
    Class.getResourceAsStream ("/some/pkg/resource.properties");
    ResourceBundle.getBundle ("some.pkg.resource");

"

经过上面的内容进行修改,就正常了。

private static String fileName;
    static {
        URI uri;
        try {
            uri = new URI(XmlUtils.class.getClassLoader().getResource("user.xml").toString());
            fileName = uri.getPath();
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }

类.class.getClassLoader().getResourceAsStream("user.xml")也可以进行读取文件,但有一点不适合用它,就是当我们的资源位于服务器上的时候,一旦服务器的资源修改后,不能读取到最新的内容,因为类只装载一次。所以先得到需要先得到路径,在进行读取内容。

 

 

 

 

转载于:https://www.cnblogs.com/shinycan/p/3577418.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值