[java] Java에서 파일의 파일 확장자를 얻으려면 어떻게합니까?

분명히하기 위해 MIME 유형을 찾고 있지 않습니다.

다음과 같은 입력이 있다고 가정 해 봅시다. /path/to/file/foo.txt

이 입력을 특히 .txt확장 을 위해 분리하는 방법을 원합니다 . Java로 이것을 수행하는 방법이 있습니까? 내 파서를 작성하지 않으려 고합니다.



답변

이 경우 Apache Commons IO의 FilenameUtils.getExtension 을 사용하십시오.

사용 방법의 예는 다음과 같습니다 (전체 경로 또는 파일 이름 만 지정할 수 있음).

String ext1 = FilenameUtils.getExtension("/path/to/file/foo.txt"); // returns "txt"
String ext2 = FilenameUtils.getExtension("bar.exe"); // returns "exe"

메이븐 의존성 :

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.6</version>
</dependency>

Gradle Groovy DSL

implementation 'commons-io:commons-io:2.6'

Gradle Kotlin DSL

implementation("commons-io:commons-io:2.6")

기타 https://search.maven.org/artifact/commons-io/commons-io/2.6/jar


답변

정말로 “파서”가 필요합니까?

String extension = "";

int i = fileName.lastIndexOf('.');
if (i > 0) {
    extension = fileName.substring(i+1);
}

단순한 Windows와 유사한 파일 이름을 다루고 있다고 가정합니다 archive.tar.gz.

Btw, 디렉토리에 ‘.’가있을 수 있지만 파일 이름 자체가 (예 :)이 아닌 경우 /path/to.a/file수행 할 수 있습니다

String extension = "";

int i = fileName.lastIndexOf('.');
int p = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));

if (i > p) {
    extension = fileName.substring(i+1);
}


답변

private String getFileExtension(File file) {
    String name = file.getName();
    int lastIndexOf = name.lastIndexOf(".");
    if (lastIndexOf == -1) {
        return ""; // empty extension
    }
    return name.substring(lastIndexOf);
}


답변

Guava 라이브러리 를 사용하는 경우 Files유틸리티 클래스 를 이용할 수 있습니다 . 특정 방법이 getFileExtension()있습니다. 예를 들어 :

String path = "c:/path/to/file/foo.txt";
String ext = Files.getFileExtension(path);
System.out.println(ext); //prints txt

또한 비슷한 함수 getNameWithoutExtension ()을 사용하여 파일 이름을 얻을 수도 있습니다 .

String filename = Files.getNameWithoutExtension(path);
System.out.println(filename); //prints foo


답변

Android의 경우 다음을 사용할 수 있습니다.

String ext = android.webkit.MimeTypeMap.getFileExtensionFromUrl(file.getName());


답변

앞에 문자가없는 파일 이름을 고려 하려면 허용 된 답변의 약간의 변형을 사용해야합니다.

String extension = "";

int i = fileName.lastIndexOf('.');
if (i >= 0) {
    extension = fileName.substring(i+1);
}

"file.doc" => "doc"
"file.doc.gz" => "gz"
".doc" => "doc"


답변

이것은 테스트 된 방법입니다

public static String getExtension(String fileName) {
    char ch;
    int len;
    if(fileName==null ||
            (len = fileName.length())==0 ||
            (ch = fileName.charAt(len-1))=='/' || ch=='\\' || //in the case of a directory
             ch=='.' ) //in the case of . or ..
        return "";
    int dotInd = fileName.lastIndexOf('.'),
        sepInd = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));
    if( dotInd<=sepInd )
        return "";
    else
        return fileName.substring(dotInd+1).toLowerCase();
}

그리고 테스트 사례 :

@Test
public void testGetExtension() {
    assertEquals("", getExtension("C"));
    assertEquals("ext", getExtension("C.ext"));
    assertEquals("ext", getExtension("A/B/C.ext"));
    assertEquals("", getExtension("A/B/C.ext/"));
    assertEquals("", getExtension("A/B/C.ext/.."));
    assertEquals("bin", getExtension("A/B/C.bin"));
    assertEquals("hidden", getExtension(".hidden"));
    assertEquals("dsstore", getExtension("/user/home/.dsstore"));
    assertEquals("", getExtension(".strange."));
    assertEquals("3", getExtension("1.2.3"));
    assertEquals("exe", getExtension("C:\\Program Files (x86)\\java\\bin\\javaw.exe"));
}