2009-06-22 9 views
16

プログラムが現在実行しているプラ​​ットフォームに関係なく、指定されたパスが絶対パスかどうかを調べるJavaがありますか。 LinuxではJava:OSに関係なくパスが絶対パスかどうかを調べる方法

::だから、私が欲しいのは、おそらく次の例のようなものです。Windowsの

new File("/home/").isAbsolute() // Should return true. 
new File("C:/My Documents").isAbsolute() // Should *also* return true. 

new File("C:/Documents").isAbsolute() // Should return true. 
new File("/home/").isAbsolute() // Should *also* return true. 

私はおそらくこれで周りを取得するために何かをコーディングすることができますが、私この問題を解決するためにJavaで提供される組み込みクラスを知っている人がいるかどうかを知りたいだけでした。それとも誰もこの問題に遭遇したことはありますか?そしてそれをどうやって解決しましたか?

ありがとうございます!

+1

、 "C:/マイドキュメント" のようなパスは、おそらく無効であり、そしてそれは確かに絶対的ではありません。 POSIX標準を実装しているシステムでは、すべてのパスが単一の 'ルート'の下に存在するため、絶対パスはそのルートから始まります。したがって絶対パスは常に "/"で始まります。プロセスの現在の作業ディレクトリとの相対的なものが他にあります。 Linuxでは、 "C:/ ..."は現在の作業ディレクトリ内で "C:"という名前のディレクトリを意味すると解釈されますが、これはほとんどナンセンスです。 – SingleNegationElimination

+1

あなたの質問はほとんど意味がありません。すべてのパスが絶対的な仮想オペレーティングシステムを想像してみてください。このオペレーティングシステムにJavaがあるとしましょう。したがって、要件を満たすには、プログラムが現在実行しているプラ​​ットフォームに関係なく、常にtrueを返すisFileAbsolute()メソッドが必要です。実装は簡単ですが、意味がありません。 –

+0

私は、ユーザがリモートコンピュータ上の作業ディレクトリを設定する状況があります。リモートコンピュータはUnixまたはWindowsを実行している可能性があります(最も一般的なシナリオはローカルマシンはWindowsで、リモートマシンはUnixです)。ユーザー指定のパスを検証する必要があり、パスが絶対パスかどうかを判断する必要があります。 –

答えて

10

いいえ。

あり、いくつかの基礎となるFileSystemのクラスは(つまりは、Java 7のですが、彼らは同様にそれに先立って存在する)isAbsoluteを(公開つまり)ですが、彼らは公共じゃない - あなたは場合でも、それらを使用し、そしてべきではありませんあなたはあなたのコードは反射の迷惑に満ちていたでしょう - そして、 "正しい" OSのものだけがJREに含まれているので、とにかくそれらの周りにコーディングする必要があります。

ここでは、開始するためのisAbsolute(...)のJava 7実装を示します。 File.getPrefixLength()はpackage-privateであることに注意してください。

Win32FileSystem

public boolean isAbsolute(File f) 
{ 
     int pl = f.getPrefixLength(); 
     return (((pl == 2) && (f.getPath().charAt(0) == slash)) 
       || (pl == 3)); 
} 

UnixFileSystem

public boolean isAbsolute(File f) 
{ 
     return (f.getPrefixLength() != 0); 
} 
+9

6年後、この回答は古くなっています。現在、Fileクラスには、「[isAbsolute()](http://docs.oracle.com/javase/7/docs/api/java/io/File.html#isAbsolute)メソッドが含まれています。このメソッドは、 d:expect "_"この抽象パス名が絶対パスかどうかをテストします絶対パス名の定義はシステムに依存しますUNIXシステムではパス名は接頭辞が "/"の場合は絶対パスですMicrosoft Windowsシステムでは、ドライブ指定子に "\\"が続くか、その接頭辞が "\\\\"の場合_ – Guus

-1

私は(Java 6の中で)これを使用して終了:

private static boolean testPath(String path) { 
    int prefixLen = FilenameUtils.getPrefixLength(path); 
    if (testPathWin(path, prefixLen) || testPathLinux(prefixLen)) 
     return true; 
    else 
     return false; 
} 

private static boolean testPathWin(String path, int prefixLen) { 
    if (prefixLen == 3) 
     return true; 
    File f = new File(path); 
    if ((prefixLen == 2) && (f.getPath().charAt(0) == '/')) 
     return true; 
    return false; 
} 

private static boolean testPathLinux(int prefixLen) { 
    return (prefixLen != 0); 
} 
+0

Java 7の実装をコピーしましたpublic boolean isAbsolute(File f)Windowsの場合、ApacheのCommons FilenameUtils.getPrefixLength()メソッドを使用しています。Java 7の実装とgetPrefixLength()のApache実装は同じではありません.UNCパスの場合、apacheは接頭辞として "\\ foo \ poo" - > "\\ foo \"を返します。長さは6 – acheron55

+0

です@ Acheron55:どのisAbsolute()を参照していますか?私のソーススニペットはどこにありますか? – stuhpa

+0

check t彼はFilenameUtils.getPrefixLength(パス)のソースコードです。 UNCパスには任意の長さの値が返されます。しかし、あなたのtestPathWinメソッドでは、長さ2か3だけチェックします。だから間違っている。あなたがそれのjava実装を使用することができるなら、それは本当です。 0,1,2,3の値しか返さないためです。 また、次の行: 'if(testPathWin(path、prefixLen)|| testPathLinux(prefixLen))' linux checkはウィンドウのメソッドをレンダリングします。ウィンドウのパスの長さが1であるとしますが、testPathメソッドはtrueを返しますが、これはfalseです – acheron55

3

アパッチFilenameUtilを使用して、この時私の亀裂 -

public static boolean isAbsolute(final String path) { 
     return FilenameUtils.getPrefixLength(path) != 0; 
    } 

これは技術的にこれを返すものです。私の目的のためにうまくいく。 Javaの7では

8

:Linux上

new File(path).isAbsolute() 
関連する問題