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

2022-09-01 04:00:34

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

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

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

我正在使用第一个工作正常,也可以在Unix,Linux,OS X上运行,但不适用于UNC路径。new File(URI(urlOfDocument).getPath())

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

......

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


答案 1

根据Simone Giannis的答案中提供的提示和链接,这是我解决这个问题的技巧

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

注意:在我的上下文中,我将收到绝对路径。我已经在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("____________________________________________________________");
    }

}

答案 2

基于@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);
    }
}