39

我正在开发一个独立于平台的应用程序。我收到一个文件 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 路径。

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

……

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

4

5 回答 5

16

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

}
于 2013-08-30T08:50:29.777 回答
7

基于@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);
    }
}
于 2017-10-17T15:06:58.323 回答
2

Java(至少 5 和 6,java 7 Paths 解决最多)存在 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 路径时可能会有所帮助。

于 2013-08-29T23:55:06.420 回答
0

对于 Java 8,以下方法有效:

  1. 从文件 URI 字符串形成一个 URI
  2. 从 URI 创建文件(不是直接从 URI 字符串,绝对 URI 字符串不是路径)

参考,下面的代码片段

    String fileURiString="file:///D:/etc/MySQL.txt";
    URI fileURI=new URI(fileURiString);
    File file=new File(fileURI);//File file=new File(fileURiString) - will generate exception

    FileInputStream fis=new FileInputStream(file);
    fis.close();
于 2019-01-10T07:01:15.583 回答
-1

我希望(未完全验证)较新的 java 带来了 nio 包和路径。希望它已修复: String s="C:\\some\\ile.txt"; System.out.println(new File(s).toPath().toUri());

于 2017-04-25T12:10:01.080 回答