将Java文件:// URL转换为File(…)path,与平台无关,包括UNCpath

我正在开发一个平台独立应用程序。 我收到一个文件的URL *。 在Windows上这些是:

  • file:///Z:/folder%20to%20file/file.txt

  • file://host/folder%20to%20file/file.txt (一个UNCpath)

我正在使用new File(URI(urlOfDocument).getPath())与第一个和Unix,Linux,OS X,但不适用于UNCpath。

什么是标准的方式来转换文件:URL到文件(..)path,与Java 6兼容?

……

*注意:我从OpenOffice / LibreOffice(XModel.getURL())接收这些URL。

基于Simone Giannis回答提供的提示和链接,这是我的破解来解决这个问题。

我正在测试uri.getAuthority(),因为UNC路径将报告一个权限。 这是一个错误 – 所以我依赖于一个错误的存在,这是邪恶的,但它似乎永远留下来(因为Java 7解决了java.nio.Paths中的问题)。

注意:在我的情况下,我将获得绝对路径。 我已经在Windows和OS X上测试过了。

(仍然在寻找更好的方法来做到这一点)

 package com.christianfries.test; import java.io.File; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; public class UNCPathTest { public static void main(String[] args) throws MalformedURLException, URISyntaxException { UNCPathTest upt = new UNCPathTest(); upt.testURL("file://server/dir/file.txt"); // Windows UNC Path upt.testURL("file:///Z:/dir/file.txt"); // Windows drive letter path upt.testURL("file:///dir/file.txt"); // Unix (absolute) path } private void testURL(String urlString) throws MalformedURLException, URISyntaxException { URL url = new URL(urlString); System.out.println("URL is: " + url.toString()); URI uri = url.toURI(); System.out.println("URI is: " + uri.toString()); if(uri.getAuthority() != null && uri.getAuthority().length() > 0) { // Hack for UNC Path uri = (new URL("file://" + urlString.substring("file:".length()))).toURI(); } File file = new File(uri); System.out.println("File is: " + file.toString()); String parent = file.getParent(); System.out.println("Parent is: " + parent); System.out.println("____________________________________________________________"); } } 

Java(至少5和6,java 7路径解决大多数)有UNC和URI的问题。 Eclipse团队将其封装在这里: http : //wiki.eclipse.org/Eclipse/UNC_Paths

从java.io.File javadocs开始,UNC前缀是“////”,java.net.URI处理file://// host / path(四个斜杠)。

关于为什么发生这种情况的更多细节以及其他URI和URL方法可能导致的问题,可以在上面给出的链接末尾的错误列表中找到。

使用这些信息,Eclipse团队开发了org.eclipse.core.runtime.URIUtil类,在处理UNC路径时,哪些源代码可能会有帮助。

基于@ SotiriosDelimanolis的评论,这里使用Spring的FileSystemResource来处理URL(如file:…)和非URL(如C:…)的方法:

 public FileSystemResource get(String file) { try { // First try to resolve as URL (file:...) Path path = Paths.get(new URL(file).toURI()); FileSystemResource resource = new FileSystemResource(path.toFile()); return resource; } catch (URISyntaxException | MalformedURLException e) { // If given file string isn't an URL, fall back to using a normal file return new FileSystemResource(file); } } 

我希望(不完全验证),更新的Java带来了NIO包和路径。 希望它有固定的: String s="C:\\some\\ile.txt"; System.out.println(new File(s).toPath().toUri()); String s="C:\\some\\ile.txt"; System.out.println(new File(s).toPath().toUri());