拡張子なしでFile
オブジェクトの名前を取得しようとしています。ファイル名が「vegetation.txt」のときに「vegetation」を取得します。私はこのコードを実装しようとしました:
_openFile = fileChooser.getSelectedFile();
String[] tokens = openFile.getName().split(".");
String name = tokens[0];
_
残念ながら、null
オブジェクトを返します。メソッドgetName()
が正しく機能するため、String
オブジェクトの定義に問題があると思います。ファイル名と拡張子が表示されます。
何かアイデアはありますか?
これを自分で実装したい場合は、これを試してください:
String name = file.getName();
int pos = name.lastIndexOf(".");
if (pos > 0) {
name = name.substring(0, pos);
}
(このバリエーションでは、「。txt」などの入力ファイル名に空の文字列が残されません。その場合、文字列を空にしたい場合は、> 0
から>= 0
。)
if
ステートメントを、コードを読みやすくすると考えた場合、条件式を使用した割り当てに置き換えることができます。たとえば、@ Stevenの回答を参照してください。 (私はそれが...とは思わないが、それは意見の問題だ。)
おそらく、他の誰かが作成およびテストした実装を使用することをお勧めします。 Apache FilenameUtils
が適切な選択です。 @slachnickの回答とリンク先のQ&Aをご覧ください。
このコードを自分で記述したくない場合は、Apacheの FilenameUtils を使用できます。
FilenameUtils.getBaseName(openFile.getName());
これは、ファイル名からパスと拡張子を除いたものを返します。
「。」の最後のインデックスの前に切り捨てることを好みます。ファイル名になります。このようにファイル名:hello.test.txtは単なるhello.testです
つまり.
int pos = filename.lastIndexOf(".");
String justName = pos > 0 ? filename.substring(0, pos) : filename;
拡張機能がない場合も処理する必要があります。
コードには2つの問題があります...
1)「。」を使用するだけsplitの引数が、望まないRejexとして解釈されているため。リテラルドットが必要です。だからあなたはそれをエスケープする必要があります...
openFile.getName().split("\\.");
2)複数のドットを持つファイルを誤って解析します。これを行う最良の方法は、最後のドットを検索して部分文字列を取得することです...
int pos = openFile.getName().lastIndexOf(".");
if(pos != -1) {
String name = openFile.getName().substring(0, pos);
}
split("\\.");
を試すことができます。つまり、基本的に.
は、正規表現ではすべての文字として扱われます。
String#splitは正規表現を取ります。 「。」任意の文字に一致するため、空の文字列の配列を取得します-文字の各ペアの間の各スポットに1つ。
http://docs.Oracle.com/javase/6/docs/api/Java/lang/String.html#split(Java.lang.String )