java中的sysLoader.getResource()问题
我有以下代码行。
sysLoader = (URLClassLoader)Thread.currentThread().getContextClassLoader(); url = sysLoader.getResource("tempFile.txt");
它给出了一个奇怪的问题。 如果我从路径中没有空格的路径(文件夹名称)运行它,那么它运行正常。 但是如果路径包含任何空格(行“c:\ New Foler …”)那么它就不起作用了。
怎么解决这个?
编辑:更详细 – 我检查了sysloader对象。
sysloader – > UCP – > path
是否有一个字符%20而不是空格的路径
因此所有URL都为空。
怎么解决这个?
这是Sun / Oracle所知,他们的建议是使用URI对象来删除%20个字符:
而不是这样做:
FileInputStream fis = new FileInputStream(url.getFile());
您可以通过首先将URL转换为URI来强制解码任何%-escaped字符,然后使用URI的路径组件作为文件名:
URI uri = new URI(url.toString()); FileInputStream fis = new FileInputStream(uri.getPath());
使用URLDecoder.decode()
方法用空格替换%20
字符。
String path = URLDecoder.decode(url.getPath(), "UTF-8");
还请记住,当资源位于jar文件中时,您必须以不同的方式处理它。 请参阅此处: 如何访问jar中的资源,它可以存在于多个jar中
要从字符串获取文件的URL,当路径包含空格时,这对我有用:
File file = new File("/Users/work space/tempFile.txt"); URL url = file.toURI().toURL();
根据Javadocs, 不推荐使用 file.toURL()
:
此方法不会自动转义URL中非法的字符。 建议新代码通过首先将其转换为URI,通过toURI方法,然后通过URI.toURL方法将URI转换为URL,将抽象路径名转换为URL。
因此使用了file.toURI().toURL()
。
对于Java 7+,可以采用这种方法:
URL url = Paths.get("/Users/work space/tempFile.txt").toURI().toURL());
注意 :如果路径以/
开头,则将其视为绝对,否则将其视为相对路径。