公司项目中getResource使用不当导致的BUG

本文探讨了一起因使用getResource方法不当导致的跨平台问题,问题出现在Linux和Windows之间。getResource原理涉及类加载器和URL对象,资源通常从war或jar包中读取。解决方案在于理解getResource对路径的处理,特别是'/'前缀的使用。修正代码时,应避免使用File.separator,而使用'/'. 提到在JavaEE项目中,推荐使用Thread.currentThread().getContextClassLoader()动态加载资源,以确保类加载器的可见性和隔离性。
摘要由CSDN通过智能技术生成

问题出现

该代码是一个文件下载的功能,代码在linux服务器上能够运行,但是检出到本地(windows)后报错。错误的原因是文件流没有获取到数据源,存在空指针异常。
从上面的分析,大概就能推断,问题的原因出现该代码无法进行跨平台执行。
这里贴两段出现问题的代码,就是简单的路径获取,没有什么业务相关的部分

String xmlPath = (new StringBuilder(128)).append(this.getClass()
                    .getResource("/").getPath()).append("uploadConfig")
                    .append(File.separator).append("upload.xml").toString();//获取xml的路径
            String modelPath = request.getSession().getServletContext().getRealPath(File.separator+"excel"+File.separator+modelName);

上面的逻辑就是获取到xml的路径,然后使用XML解析对象拿到modelName属性,这个属性的值是一个Excel文件的简单名称,然后拿到这个Excel文件的服务器真实路径。

可以看到,上面的代码其实考虑到了跨平台性,因为使用了File.sparator,该常量在unix系统会被识别为/,而在window系统会被识别为\\ 。
上面的问题主要出现在getResource上。

getResource原理

    public java.net.URL getResource(String name) {
   
        name = resolveName(name);
        ClassLoader cl = getClassLoader0();
        if 
getResource() 方法是Java用于获资源文件的方法。getResource() 方法返回一个 URL 对象,该对象指向指定资源的位置。以下是关于getResource()使用的几个问题的解答: 1. getResource() 方法可以用来获哪些类型的资源文件? getResource() 方法可以用来获任何类型的资源文件,包括图片、音频、视频、文本等文件。 2. getResource() 方法返回的 URL 对象指向哪里? getResource() 方法返回的 URL 对象指向指定资源文件在 classpath 的位置。如果资源文件不在 classpath ,则返回 null。 3. getResource() 方法可以用来获本地文件系统的资源文件吗? getResource() 方法不能用来获本地文件系统的资源文件,只能用来获 classpath 的资源文件。 4. getResource() 方法如何使用? getResource() 方法可以在任何 Java使用,只需要使用该类的 Class 对象调用 getResource() 方法,如下所示: ```java URL resource = MyClass.class.getResource("myresource.txt"); ``` 这将返回 myresource.txt 文件在 classpath 的位置的 URL 对象。注意,getResource() 方法的参数是相对于类所在的包的路径,因此要使用相对路径。 5. getResource() 方法和 getResourceAsStream() 方法有什么区别? getResource() 方法返回的是一个 URL 对象,可以用于打开流来读资源文件。而 getResourceAsStream() 方法返回的是一个 InputStream 对象,可以直接用于读资源文件。getResourceAsStream() 方法更适合读文本文件等资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值