プラットフォームに依存しないアプリケーションを開発しています。ファイル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())から受け取っています。
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("____________________________________________________________");
}
}
@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);
}
}
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パスを処理するときにおそらくソースコードが役立ちます。
Java 8の場合、次のメソッドが機能します。
以下のコードスニペットを参照してください
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();