将Java文件:// URL转换为文件(…)路径,独立于平台,包括UNC路径

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

> file:/// Z:/ folder to file / file.txt
> file:// host / folder to file / file.txt(一个UNC路径)

我正在使用新的File(URI(urlOfDocument).getPath()),它可以与第一个文件兼容,也可以在Unix,Linux,OS X上工作,但不支持UNC路径.

将文件:URL转换为File(..)路径,与Java 6兼容的标准方法是什么?

……

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

最佳答案
根据Simone Giannis回答中提供的提示和链接,这是我的黑客来解决这个问题.

我正在测试uri.getAuthority(),因为UNC路径将报告一个权限.这是一个错误 – 所以我依赖于一个bug,这是一个邪恶的存在,但它似乎就像永远保持一样(因为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文件:// URL转换为文件(…)路径,独立于平台,包括UNC路径 - 代码日志