web-dev-qa-db-ja.com

システムファイル区切り記号を使用したファイル名の分割

完全なファイルパスがあり、ファイル名を取得したい。

次の手順を使用しています。

String[] splittedFileName = fileName.split(System.getProperty("file.separator"));
String simpleFileName = splittedFileName[splittedFileName.length-1];

しかし、Windowsでは次のようになります。

Java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
\
 ^

この例外を回避できますか?これを行うより良い方法はありますか?

ファイル名を書き込む場合は、System.getProperty("file.separator")を使用する必要があります。

ファイル名を読み取るときに、ファイルの区切り文字としてスラッシュまたはバックスラッシュを使用することができます。

次のことを試してみてください。

fileName = fileName.replace("\\", "/");
String[] splittedFileName = fileName.split("/"));
String simpleFileName = splittedFileName[splittedFileName.length-1];
7

別のより簡単な方法は、

File f = new File(path);
String fileName = f.getName();

パスがプラットフォームと互換性があれば、これは機能すると思います。つまり、パス「c:\ file.txt」がLinuxで機能するかどうかは不明です。

2
Kalpak Gadre

まず、この特定の問題については、正規表現の代わりにJava.util.Fileクラスを使用することをお勧めします。

そうは言っても、あなたが遭遇している問題の根本的な原因は、バックスラッシュ文字「\」がJava正規表現のエスケープシーケンスを意味していることです。エスケープシーケンスを完了する文字の後に別の文字があることを期待しています。これを回避する最も簡単な方法は、指定した文字列内の特殊文字をエスケープするJava.util.regex.Pattern.quote()メソッドを使用することです。それ。

この変更により、コードは次のようになります。

String splitRegex = Pattern.quote(System.getProperty("file.separator"));
String[] splittedFileName = fileName.split(splitRegex);
String simpleFileName = splittedFileName[splittedFileName.length-1];
1
Mike Deck