将 Java file:// URL 转换为 File(...) 路径,与平台无关,包括 UNC 路径

新手上路,请多包涵

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

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

  • file://host/folder%20to%20file/file.txt (UNC路径)

我正在使用 new File(URI(urlOfDocument).getPath()) 它适用于第一个以及在 Unix、Linux、OS X 上,但不适用于 UNC 路径。

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

……

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

原文由 Christian Fries 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 769
1 个回答

根据 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("____________________________________________________________");
    }

}

原文由 Christian Fries 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题