Java에서 확장자없이 파일 이름을 얻는 방법은 무엇입니까?


답변:


429

나처럼, 파일 이름이 아닌 경로 에 null 또는 점 을 전달하면 발생하는 것과 같은 모든 특수 사례를 생각한 라이브러리 코드 를 사용하려는 경우 다음을 사용할 수 있습니다.

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

61
FilenameUtils.getBasename을 사용하여 경로 문자열에서 확장명없이 파일 이름으로 바로 이동할 수도 있습니다.
Ian Durkan

2
가장 쉬운 것은 물론 maven을 실행하는 것입니다 :-) 그렇지 않으면 참조 : commons.apache.org/io
Ulf Lindback

8
구아바를 선호하는 사람들 에게도 그렇게 할 수 있습니다 . (이때 필자는 개인적으로 Apache Commons 종속성을 추가하는 것에 대해 개인적으로 기분이 좋지 않지만 역사적으로 이러한 라이브러리는 매우 유용했습니다.)
Jonik

3
구아바 및 가공-IO는 약간의 여분을 제공 할 수 있지만, 당신은 이미 얼마나 많은 편리한 방법 놀라게 될 것 JDK 7에 포함java.nio.file.FilesPath- 같은 파일 이름 만 받고 해결하는 기본 디렉토리, 한 줄의 복사 / 이동 파일로 등
돈 치들

3
@Lan Durkan은 현재 대문자 N 인 FilenameUtils.getBaseName
Slow Harry

153

가장 쉬운 방법은 정규식을 사용하는 것입니다.

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

위의 표현은 마지막 점과 하나 이상의 문자를 제거합니다. 기본 단위 테스트는 다음과 같습니다.

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

11
정규식은 위의 라이브러리 솔루션만큼 사용하기 쉽지 않습니다. 그것은 작동하지만 (REGEX를 해석하지 않고) 코드를 보는 것이 코드가 무엇인지 명확하지 않습니다.
구스타보 리 토프 스키

5
@GustavoLitovsky Android는와 함께 제공되지 않습니다 org.apache.commons. 내가 아는 한, 이것이 안드로이드에서 할 수있는 유일한 방법입니다.
Liam George Betsworth

1
/ * 다음 정규식은 * / "/the/path/name.extension".replaceAll(".*[\\\\/]|\\.[^\\.]*$", "") 경로도 제거합니다. ;
daggett

1
"/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.gz는 gzipped 버전 foo.tar이므로 gz확장 이라고 주장 할 수 있습니다 . 모두 확장을 정의하는 방법에 달려 있습니다.
paxdiablo

2
같은 파일로 무엇을해야 .gitignore합니까?
michael nesterenko

자바에서 클래스 이름은 작은 문자로 시작해서는 안됩니다!
AnujKu

7
그것이 규칙이라면, 언어는 그것을 강제 할 것입니다. 그렇지 않기 때문에 그것은 강력하게 제안되는 지침입니다. 어쨌든, 그것은 질문과 답변과 전혀 관련이 없습니다.
paxdiablo

47

내 선호도에 따른 통합 목록 순서는 다음과 같습니다.

아파치 커먼즈 사용하기

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);

또는 코어 자바 사용

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;
}

삼)

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 와 본질적으로 동일 합니다. 구아바도 마찬가지라고 지적하고 싶었습니다. 개인적으로 저는 Commons에 의존성을 추가하고 싶지 않았습니다. 이것 때문에.)


2
실제로 그것은 더 비슷합니다FilenameUtils.getBaseName()
Angelo.Hannes

실제로 구아바는 불안정한 라이브러리이므로 가능한 한 사용하지 않는 것이 좋습니다. googel의 실험보다 안정적인 유물을 선호합니다
Slava

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

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 경로에 대처할 수 있습니다.

그러나 유닉스 스타일 경로 ( "/"구분 기호 포함)와 함께 사용할 정적 유틸리티 메소드를 원한다면 아래 코드가 유용 할 것입니다.

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"

도움이 되었기를 바랍니다 ..


그것은 이미 받아 들여진 대답에 있습니다.이 게시물의 요점은 무엇입니까?
Tom

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

파일 이름에 확장자가 하나 뿐인 점이 확실하면 java split 함수를 사용하여 파일 이름을 확장자에서 분리 할 수 ​​있습니다.

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

따라서 split[0]"test"를 반환하고 split [1]은 "txt"를 반환합니다


-3

아래 코드를 사용해보십시오. 핵심 Java 기본 기능 사용 그것은 처리한다 String확장자들, 그리고 (포함하지 않는 확장자가없는 '.'문자). 복수의 경우 '.'도 다룹니다.

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

1
반면에 프로젝트에 많은 라이브러리를 추가하면 라이브러리가 더 커집니다. 따라서 이와 같은 간단한 일은 스스로 할 수 있습니다.
니콜라스 타일러

1
당신이 이것을 직접해서는 안됩니다. 어렵다 : 확장자가없는 파일. 경로, ftp 경로, 창 및 유닉스 슬래시, 심볼릭 링크 등에서 당신은 확실히 실패 할 것이고 약간의 메모리를 얻으려고하면 많은 불안정성을 광고하게 될 것입니다. 라이센스가 허용하는 경우 최소한 확립 된 코드의 소스를 최소한 복사하십시오.
Jonathan Nappee

이 코드는 'if (! str.contains ( "."))'를 위협하는 것을 제외하고는 Amit Mishra의 코드와 비슷합니다.
Broken_Window

다음과 같은 경우 "/someFolder/some.other.folder/someFileWithoutExtention"에서 실패합니다. 2 초 후에 가장 먼저 떠 올랐던 점. 나는 많은 다른 예제들을 생각 해낼 수 있다고 확신한다.
Newtopian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.