【问题标题】:sysLoader.getResource() problem in javajava中的sysLoader.getResource()问题
【发布时间】:2011-03-16 20:49:24
【问题描述】:

我有以下几行代码。

sysLoader = (URLClassLoader)Thread.currentThread().getContextClassLoader();
url = sysLoader.getResource("tempFile.txt");

这是一个奇怪的问题。如果我从路径(文件夹名称)中没有空格的路径运行它,那么它运行良好。但如果路径包含任何空格(行“c:\New Foler...”),则它不起作用。

如何解决?

编辑:更详细 - 我检查了 sysloader 对象。

sysloader -> UCP -> 路径

路径中的字符为 %20 而不是空格

因此所有的 URL 都是空的。

如何解决?

【问题讨论】:

  • 定义“不工作”。它是否返回null?还是返回的URL 在某些情况下不起作用?

标签: java url classloader


【解决方案1】:

使用URLDecoder.decode()方法将%20字符替换为空格。

String path = URLDecoder.decode(url.getPath(), "UTF-8");

还请记住,当资源位于 jar 文件中时,您必须以不同的方式处理它。看到它,例如这里:How to access resources in jar where it can be present in multiple jar

【讨论】:

  • 从使用的getResource获取URL后,在文件中传递路径的同时,我们可以使用URLDecoder#decode方法。像这样的东西: File file = new File(URLDecoder.decode(testFile.getFile(), "UTF-8"));这里,testFile 是一个 URL 对象。我正在添加评论,因为即使我发现答案很有用,我也不得不以某种方式考虑如何使用它。还是谢谢。
【解决方案2】:

Sun/Oracle 知道这一点,他们的建议是使用 URI 对象来删除 %20 个字符:

不要这样做:

FileInputStream fis = new FileInputStream(url.getFile());

您可以通过首先将 URL 转换为 URI,然后使用 URI 的路径组件作为文件名来强制解码任何 % 转义字符:

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

【讨论】:

  • 这是相应的但标记为“不会修复”的报告:bugs.sun.com/bugdatabase/view_bug.do?bug_id=4466485。 Java 1.7 中仍然存在此错误/功能。
  • 没有显式转换为字符串并返回 URI 的较短版本是:URI uri = url.toURI();FileInputStream fis = new FileInputStream(uri.getPath());
【解决方案3】:

要从字符串中获取文件的 URL,当路径包含空格时,这对我有用:

File file = new File("/Users/work space/tempFile.txt");
URL url = file.toURI().toURL();

根据 Javadocs,file.toURL()deprecated

此方法不会自动转义 URL 中的非法字符。建议新代码将抽象路径名转换为 URL,首先通过 toURI 方法将其转换为 URI,然后通过 URI.toURL 方法将 URI 转换为 URL。

因此使用file.toURI().toURL()

对于 Java 7+,可以采用这种方法:

URL url = Paths.get("/Users/work space/tempFile.txt").toURI().toURL());

注意:如果路径以/ 开头,则视为绝对路径,否则视为相对路径。

【讨论】:

    猜你喜欢
    • 2011-06-28
    • 2015-01-16
    • 2010-12-30
    • 2011-03-08
    • 2016-10-19
    • 2011-09-04
    • 2014-05-01
    • 2014-11-17
    • 2011-08-07
    相关资源
    最近更新 更多