web-dev-qa-db-ja.com

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パスでは動作しません。

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

......

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

24
Christian Fries

Simone Giannisの回答で提供されたヒントとリンクに基づいて、これは私のhackです。

UNCパスが機関を報告するため、uri.getAuthority()でテストしています。これはバグです。したがって、私はバグの存在に頼っていますが、これは悪です。しかし、これは永遠に残るかのように見えます(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("____________________________________________________________");
    }

}
9
Christian Fries

@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);
    }
}
3
Markus Pscheidt

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パスを処理するときにおそらくソースコードが役立ちます。

2
Simone Gianni

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();
0
Ironluca