39

プラットフォームに依存しないアプリケーションを開発しています。ファイルの URL* を受信して​​います。Windows では、次のとおりです。

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

  • file://host/folder%20to%20file/file.txt(UNC パス)

最初のものと、Unix、Linux、OS X でも正常に動作するものを使用しnew File(URI(urlOfDocument).getPath())ていますが、UNC パスでは動作しません。

file: URL を File(..) パスに変換する標準的な方法は何ですか? Java 6 と互換性がありますか?

……

* 注: OpenOffice / LibreOffice (XModel.getURL()) からこれらの URL を受け取っています。

4

5 に答える 5

16

Simone Giannis' answerで提供されているヒントとリンクに基づいて、これはこれを修正するための私のハックです。

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 のパスで最も解決済み) には、UNC と URI に問題があります。Eclipse チームはここでまとめました: http://wiki.eclipse.org/Eclipse/UNC_Paths

java.io.File javadocs によると、UNC プレフィックスは「////」であり、java.net.URI は file:////host/path (4 つのスラッシュ) を処理します。

これが発生する理由と、他の URI および URL メソッドで発生する可能性のある問題の詳細については、上記のリンクの最後にあるバグのリストを参照してください。

これらの情報を使用して、Eclipse チームは org.eclipse.core.runtime.URIUtil クラスを開発しました。このソース コードは、UNC パスを処理する際に役立つ可能性があります。

于 2013-08-29T23:55:06.420 に答える