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

时间:2013-08-29 21:05:43

标签: java windows url

我正在开发一个独立于平台的应用程序。我收到一个文件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(..)路径,与Java 6兼容的标准方法是什么?

...

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

5 个答案:

答案 0 :(得分:9)

根据Simone Giannis回答提供的提示和链接,这是我的 hack 来解决这个问题。

我正在测试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("____________________________________________________________");
    }

}

答案 1 :(得分:2)

基于@ SotiriosDelimanolis的评论,这里有一个使用Spring的FileSystemResource处理URL(例如文件:...)和非URL(例如C:...)的方法:

empty

答案 2 :(得分:1)

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路径时,这些源代码可能会有所帮助。

答案 3 :(得分: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();

答案 4 :(得分:-1)

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