Javaの知識はほとんどありません。 WindowsでFilePath(String)
からURIの文字列表現を作成する必要があります。私が得るinputFilePath
はfile:/C:/a.txt
であり、C:/a.txt
です。今、私がやっていることは:
new File(inputFilePath).toURI().toURL().toExternalForm()
上記はfile:/
のプレフィックスが付いていないパスに対しては正常に機能しますが、file:/
のプレフィックスが付いたパスの場合、.toURI
メソッドは値を追加することで無効なURIに変換します現在のディレクトリ、したがってパスは無効になります。
両方の種類のパスに対して適切なURIを取得する正しい方法を提案して、私を助けてください。
有効なファイルuriは次のとおりです。
file:/C:/a.txt <- On Windows
file:///C:/a.txt <- On Windows
file:///home/user/a.txt <- On Linux
そのため、Windowsではfile:/
またはfile:///
、Linuxではfile://
を削除する必要があります。
https://jaxp.Java.net のSAXLocalNameCount.Javaから:
/**
* Convert from a filename to a file URL.
*/
private static String convertToFileURL ( String filename )
{
// On JDK 1.2 and later, simplify this to:
// "path = file.toURL().toString()".
String path = new File ( filename ).getAbsolutePath ();
if ( File.separatorChar != '/' )
{
path = path.replace ( File.separatorChar, '/' );
}
if ( !path.startsWith ( "/" ) )
{
path = "/" + path;
}
String retVal = "file:" + path;
return retVal;
}
Normalize();
を使用するだけです
例:
path = Paths.get("/", input).normalize();
この1行はnormalizeすべてのパスになります。
new File(String)
への引数は、URIではなくパスです。したがって、「しかし」の後の投稿の部分は、APIの無効な使用です。
class TestPath {
public static void main(String[] args) {
String brokenPath = "file:/C:/a.txt";
System.out.println(brokenPath);
if (brokenPath.startsWith("file:/")) {
brokenPath = brokenPath.substring(6,brokenPath.length());
}
System.out.println(brokenPath);
}
}
出力を提供します:
file:/C:/a.txt
C:/a.txt
Press any key to continue . . .