FileLocator.resolve(url)的转义结果
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FileLocator.resolve(url)的转义结果相关的知识,希望对你有一定的参考价值。
方法FileLocator.resolve(url)
可用于将地址bundleentry://something/somewhere/x.txt
转换为/mnt/foo/somewhere/x.txt
的正确文件URL。
但是,https://bugs.eclipse.org/bugs/show_bug.cgi?id=145096也记录了该URL,URL未被转义。例如,如果包含引用的bundle的Eclipse安装位于包含空格的目录中,则FileLocator.resolve
返回的URL仍包含空格,因此调用url.toURI()
失败。
- 如何手动转义URL中的所有必要字符?
- 如何根据相对于当前束的路径获取
File
对象?
作为参考,这里是在我的插件的dir
文件中找到目录.jar
时失败的代码,如果该文件位于包含空格的目录中:
final IPath pathOfExampleProject = new Path("dir");
final Bundle bundle = Platform.getBundle(AproveIDs.PLUGIN_ID);
final URL url = FileLocator.find(bundle, pathOfExampleProject, null);
final URL url2 = FileLocator.toFileURL(url);
url2.toURI(); // Illegal character in path at index [...]
答案
我刚发现这段代码:
相关的行确实有帮助:
// We need to use the 3-arg constructor of URI in order to properly escape file system chars.
URI resolvedUri = new URI(resolvedUrl.getProtocol(), resolvedUrl.getPath(), null);
另一答案
另外两个说明:
- FileLocator.resolve确实解析了一个URL,但它不一定返回一个文件:/ URL。在捆绑包(在.jar中)的默认情况下,您应该使用FileLocator.toFileURL,如果需要,它会自动将资源提取到缓存。
- 由于Eclipse 4.x现在默认包含EMF Common API,因此您可以使用EMF的URI API更简单地转义URL,如下所示:
URI resolvedUri = URI.createFileURI(resolved.getPath());
要获取文件名,请调用resolvedUri.toFileString();
另一答案
URL url;
try {
url = new
URL("platform:/plugin/de.vogella.rcp.plugin.filereader/files/test.txt");
InputStream inputStream = url.openConnection().getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
要获取URL,可以使用以下内容:
Bundle thisBundle = FrameworkUtil.getBundle(getClass());
URL fileURL = thisBundle.getEntry("<relative_file_path_from_project_root");
此外,可以选择Stream / Reader的类型来读取图像/文本。
以上是关于FileLocator.resolve(url)的转义结果的主要内容,如果未能解决你的问题,请参考以下文章