Javaで拡張子なしでファイル名を取得するにはどうすればよいですか?


回答:


429

私と同じように、パスにヌルまたはドットを渡し、ファイル名には渡さない場合のような、すべての特殊なケースを考慮したライブラリコードを使用したい場合は、以下を使用できます。

import org.apache.commons.io.FilenameUtils;
String fileNameWithOutExt = FilenameUtils.removeExtension(fileNameWithExt);

61
FilenameUtils.getBasenameを使用して、パス文字列から拡張子なしのファイル名に直接移動することもできます。
Ian Durkan、2011年

2
もちろん、最も簡単なのはmavenを実行することです:-)それ以外の場合は、commons.apache.org
Ulf Lindbackを

8
グアバを好む人のために、それもこれを行うことができます。(Apache Commonsの依存関係を追加することについて、私は個人的にあまり気分がよくありませんが、歴史的にこれらのライブラリーは非常に便利でした。)
Jonik

3
グアバとコモンズ-IOは少し余分を提供するかもしれませんが、あなたは、メソッドがすでにされているどのように多くの利便驚かれると思いJDK 7に含まれjava.nio.file.Filesし、Pathファイル名のみを取得し、そのようなベースディレクトリを解決するよう、1行は、ファイルを移動/コピーします-など
ドン・チードル

3
@Lan Durkanの現在のFilenameUtils.getBaseNameは大文字のNです
スローハリー

153

最も簡単な方法は、正規表現を使用することです。

fileNameWithOutExt = "test.xml".replaceFirst("[.][^.]+$", "");

上記の式は、最後のドットとそれに続く1つ以上の文字を削除します。これが基本的な単体テストです。

public void testRegex() {
    assertEquals("test", "test.xml".replaceFirst("[.][^.]+$", ""));
    assertEquals("test.2", "test.2.xml".replaceFirst("[.][^.]+$", ""));
}

11
Regexは、上記のライブラリソリューションほど簡単に使用できません。それは機能しますが、コードを見る(REGEXを解釈する必要がない)ことは、それが何をするか明らかではありません。
Gustavo Litovsky

5
@GustavoLitovsky Androidはにバンドルされていませんorg.apache.commons。私の知る限り、これがAndroidでこれを行う唯一の方法です。
リアムジョージベッツワース2014

1
/ *次の正規表現もパスを削除します* / "/the/path/name.extension".replaceAll(".*[\\\\/]|\\.[^\\.]*$"、 "") ;
daggett、2015

1
2番目の文字クラスにスラッシュを追加して、「/ foo / bar.x / baz」のようなパスにつまずかれないようにします
chrisinmtown

53

次のテストプログラムを参照してください。

public class javatemp {
    static String stripExtension (String str) {
        // Handle null case specially.

        if (str == null) return null;

        // Get position of last '.'.

        int pos = str.lastIndexOf(".");

        // If there wasn't any '.' just return the string as is.

        if (pos == -1) return str;

        // Otherwise return the string, up to the dot.

        return str.substring(0, pos);
    }

    public static void main(String[] args) {
        System.out.println ("test.xml   -> " + stripExtension ("test.xml"));
        System.out.println ("test.2.xml -> " + stripExtension ("test.2.xml"));
        System.out.println ("test       -> " + stripExtension ("test"));
        System.out.println ("test.      -> " + stripExtension ("test."));
    }
}

出力:

test.xml   -> test
test.2.xml -> test.2
test       -> test
test.      -> test

の拡張子はfoo.tar.gz何ですか?なぜ.tar.gzあなたが望んでいるのかが分かります。
tchrist

5
@tchristはのfoo.tar.gzgzip圧縮されたバージョンであるfoo.tarためgz、それが拡張機能であると主張することもできます。すべては、拡張機能をどのように定義するにかかっています。
paxdiablo 2011

2
のようなファイルを.gitignoreどうするか?
マイケル・ネステレンコ

ご存知のように、Javaのクラス名は小文字で始めないでください。
AnujKu 2013年

7
それがルールだったら、言語はそれを強制するでしょう。そうではないので、それはガイドラインですが、強く推奨されています。いずれにせよ、それは質問と回答にはまったく関係ありません。
paxdiablo 2013年

47

これが私の好みによる統合リストの順序です。

Apache Commonsを使用する

import org.apache.commons.io.FilenameUtils;

String fileNameWithoutExt = FilenameUtils.getBaseName(fileName);

                           OR

String fileNameWithOutExt = FilenameUtils.removeExtension(fileName);

Google Guavaを使用する(すでに使用している場合)

import com.google.common.io.Files;
String fileNameWithOutExt = Files.getNameWithoutExtension(fileName);

またはCore Javaを使用する

1)

String fileName = file.getName();
int pos = fileName.lastIndexOf(".");
if (pos > 0 && pos < (fileName.length() - 1)) { // If '.' is not the first or last character.
    fileName = fileName.substring(0, pos);
}

2)

if (fileName.indexOf(".") > 0) {
   return fileName.substring(0, fileName.lastIndexOf("."));
} else {
   return fileName;
}

3)

private static final Pattern ext = Pattern.compile("(?<=.)\\.[^.]+$");

public static String getFileNameWithoutExtension(File file) {
    return ext.matcher(file.getName()).replaceAll("");
}

Liferay API

import com.liferay.portal.kernel.util.FileUtil; 
String fileName = FileUtil.stripExtension(file.getName());

42

プロジェクトでGuava(14.0以降)を使用している場合は、を使用できますFiles.getNameWithoutExtension()

(基本的に、FilenameUtils.removeExtension()Apache Commons IO と同じですが、投票数最も多い回答が示唆しています。Guavaもこれを行うことを指摘したかっただけです。個人的には、依存関係をCommonsに追加したくありませんでした。これだけのために)


2
実際にはもっと似ていますFilenameUtils.getBaseName()
Angelo.Hannes '09 / 09/13

実際、guavaは非常に不安定なlibなので、できる限り使用しないでください。グーゲルによる実験よりも安定した遺物を好む
スラバ

8

以下はhttps://android.googlesource.com/platform/tools/tradefederation/+/master/src/com/android/tradefed/util/FileUtil.javaからの参照です

/**
 * Gets the base name, without extension, of given file name.
 * <p/>
 * e.g. getBaseName("file.txt") will return "file"
 *
 * @param fileName
 * @return the base name
 */
public static String getBaseName(String fileName) {
    int index = fileName.lastIndexOf('.');
    if (index == -1) {
        return fileName;
    } else {
        return fileName.substring(0, index);
    }
}

1
すばらしい情報ですが、ユーザーは、このメソッドが「」を返す「.htaccess」のような場合に注意してください。
Markus Schulte 2017年

6

apache.commons全体をインポートしたくない場合は、同じ機能を抽出しました。

public class StringUtils {
    public static String getBaseName(String filename) {
        return removeExtension(getName(filename));
    }

    public static int indexOfLastSeparator(String filename) {
        if(filename == null) {
            return -1;
        } else {
            int lastUnixPos = filename.lastIndexOf(47);
            int lastWindowsPos = filename.lastIndexOf(92);
            return Math.max(lastUnixPos, lastWindowsPos);
        }
    }

    public static String getName(String filename) {
        if(filename == null) {
            return null;
        } else {
            int index = indexOfLastSeparator(filename);
            return filename.substring(index + 1);
        }
    }

    public static String removeExtension(String filename) {
        if(filename == null) {
            return null;
        } else {
            int index = indexOfExtension(filename);
            return index == -1?filename:filename.substring(0, index);
        }
    }

    public static int indexOfExtension(String filename) {
        if(filename == null) {
            return -1;
        } else {
            int extensionPos = filename.lastIndexOf(46);
            int lastSeparator = indexOfLastSeparator(filename);
            return lastSeparator > extensionPos?-1:extensionPos;
        }
    }
}

4

私はライブラリを再利用することに強い信念を持っていますが、org.apache.commons.io JARは174KBであり、モバイルアプリの場合は特に大きくなります。

ソースコードをダウンロードしてそれらのFilenameUtilsクラスを見ると、多くの追加ユーティリティがあり、WindowsとUnixのパスに対応していることがわかります。

ただし、Unixスタイルのパス( "/"区切り記号付き)で使用するためのいくつかの静的ユーティリティメソッドが必要な場合は、以下のコードが役立つことがあります。

このremoveExtensionメソッドは、パスの残りの部分をファイル名とともに保存します。同様なものもありますgetExtension

/**
 * Remove the file extension from a filename, that may include a path.
 * 
 * e.g. /path/to/myfile.jpg -> /path/to/myfile 
 */
public static String removeExtension(String filename) {
    if (filename == null) {
        return null;
    }

    int index = indexOfExtension(filename);

    if (index == -1) {
        return filename;
    } else {
        return filename.substring(0, index);
    }
}

/**
 * Return the file extension from a filename, including the "."
 * 
 * e.g. /path/to/myfile.jpg -> .jpg
 */
public static String getExtension(String filename) {
    if (filename == null) {
        return null;
    }

    int index = indexOfExtension(filename);

    if (index == -1) {
        return filename;
    } else {
        return filename.substring(index);
    }
}

private static final char EXTENSION_SEPARATOR = '.';
private static final char DIRECTORY_SEPARATOR = '/';

public static int indexOfExtension(String filename) {

    if (filename == null) {
        return -1;
    }

    // Check that no directory separator appears after the 
    // EXTENSION_SEPARATOR
    int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);

    int lastDirSeparator = filename.lastIndexOf(DIRECTORY_SEPARATOR);

    if (lastDirSeparator > extensionPos) {
        LogIt.w(FileSystemUtil.class, "A directory separator appears after the file extension, assuming there is no file extension");
        return -1;
    }

    return extensionPos;
}

1
public static String getFileExtension(String fileName) {
        if (TextUtils.isEmpty(fileName) || !fileName.contains(".") || fileName.endsWith(".")) return null;
        return fileName.substring(fileName.lastIndexOf(".") + 1);
    }

    public static String getBaseFileName(String fileName) {
        if (TextUtils.isEmpty(fileName) || !fileName.contains(".") || fileName.endsWith(".")) return null;
        return fileName.substring(0,fileName.lastIndexOf("."));
    }

1

相対パスまたは完全パスから名前を取得する最も簡単な方法は、

import org.apache.commons.io.FilenameUtils; FilenameUtils.getBaseName(definitionFilePath)


0

「。」で分割できます。インデックス0はファイル名、1は拡張子ですが、最初の記事で述べたように、apache.commons-ioのFileNameUtilsを使用して最善の解決策を求めます。削除する必要はありませんが、十分です:

String fileName = FilenameUtils.getBaseName("test.xml");


0

Apache Commons IOFilenameUtils.removeExtensionからの使用

例:

あなたは提供することができ、完全なパス名ファイル名のみを

String myString1 = FilenameUtils.removeExtension("helloworld.exe"); // returns "helloworld"
String myString2 = FilenameUtils.removeExtension("/home/abc/yey.xls"); // returns "yey"

お役に立てれば ..


それはすでに受け入れられた答えにあります、この投稿のポイントは何ですか?
トム

0

流暢な方法:

public static String fileNameWithOutExt (String fileName) {
    return Optional.of(fileName.lastIndexOf(".")).filter(i-> i >= 0)
            .map(i-> fileName.substring(0, i)).orElse(fileName);
}

0

シンプルに保つには、JavaのString.replaceAll()メソッドを次のように使用します。

String fileNameWithExt = "test.xml";
String fileNameWithoutExt
   = fileNameWithExt.replaceAll( "^.*?(([^/\\\\\\.]+))\\.[^\\.]+$", "$1" );

これは、fileNameWithExtに完全修飾パスが含まれている場合にも機能します。


0

ファイル名に拡張子用のドットが1つしかないことが確実な場合は、java split関数を使用してファイル名を拡張子から分割できます。

File filename = new File('test.txt'); File.getName().split("[.]");

したがって、split[0]「test」を返し、split [1]は「txt」を返します


-3

以下のコードを試してください。コアJava基本機能の使用。それはの世話をString拡張子を持つS、及び(なし拡張子なし'.'の文字)。複数の場合'.'もカバーされます。

String str = "filename.xml";
if (!str.contains(".")) 
    System.out.println("File Name=" + str); 
else {
    str = str.substring(0, str.lastIndexOf("."));
    // Because extension is always after the last '.'
    System.out.println("File Name=" + str);
}

あなたはそれをnull文字列で動作するように適応させることができます。


1
この種の機能を自分で実装するのはかなり悪い習慣です。一見するとタスクは非常に明白であるように見えますが、実際には多くの例外的な状況に直面.します(ファイル名がない、またはファイルがバックアップでありdocument.docx.backup、などの名前を持つなど)。このすべての例外的な状況に対処する外部ライブラリを使用する方がはるかに信頼性が高くなります。
ivstas 2014

1
一方、プロジェクトに多くのライブラリを追加すると、プロジェクトが大きくなります。このような単純なことは自分で行うことができます。
Nicolas Tyler

1
自分でこれを行うべきではありません。これは難しいです:拡張子のないファイルです。パス、ftpパス、windowsとunixスラッシュ、シンボリックリンクなどで...確かに失敗し、少しのメモリを獲得しようとすると、多くの不安定性が生じます。ライセンスで許可されている場合は、少なくとも確立されたコードのソースをコピーしてください。
ジョナサンナピー2015年

このコードは、威圧的な 'if(!str.contains( "。"))'を除いて、Amit Mishraのコードに似ています
Broken_Window

次の場合は失敗します "/someFolder/some.other.folder/someFileWithoutExtention"。2秒後に最初に思い浮かんだのは、他の例がたくさんあると思います。
2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.