Java로 파일의 파일 확장자를 얻으려면 어떻게해야합니까?


13 Answers

이것을 위해 "파서"가 정말로 필요합니까?

String extension = "";

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

당신이 archive.tar.gz 같은 것이 아닌 단순한 Windows와 비슷한 파일 이름을 다루고 있다고 가정합니다.

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

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

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

이 입력을, 특히 .txt 확장자로 나눌 수있는 방법이 필요합니다. Java에서이 작업을 수행 할 수있는 방법이 있습니까? 나는 내 파서를 쓰는 것을 피하고 싶다.




  @Test
    public void getFileExtension(String fileName){
      String extension = null;
      List<String> list = new ArrayList<>();
      do{
          extension =  FilenameUtils.getExtension(fileName);
          if(extension==null){
              break;
          }
          if(!extension.isEmpty()){
              list.add("."+extension);
          }
          fileName = FilenameUtils.getBaseName(fileName);
      }while (!extension.isEmpty());
      Collections.reverse(list);
      System.out.println(list.toString());
    }



그냥 정규식 기반 대안. 그렇게 빠르지도 좋지도 않다.

Pattern pattern = Pattern.compile("\\.([^.]*)$");
Matcher matcher = pattern.matcher(fileName);

if (matcher.find()) {
    String ext = matcher.group(1);
}



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

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



path = "/Users/test/test.txt"

extension = path.substring(path.lastIndexOf("."), path.length());

return ".txt"

"txt"만 원하면 path.lastIndexOf(".") + 1




다른 모든 대답에서 분명히 알 수 있듯이 적절한 "기본 제공"기능은 없습니다. 이것은 안전하고 간단한 방법입니다.

String getFileExtension(File file) {
    if (file == null) {
        return "";
    }
    String name = file.getName();
    int i = name.lastIndexOf('.');
    String ext = i > 0 ? name.substring(i + 1) : "";
    return ext;
}



이 특정 질문은 나에게 많은 문제를 준다. 나는이 문제에 대한 아주 간단한 해결책을 발견했다.

file.getName().toLowerCase().endsWith(".txt");

그게 전부 야.




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



방법 (Java 1.5 RegEx 사용) :

    String[] split = fullFileName.split("\\.");
    String ext = split[split.length - 1];



여기에서는 작은 메소드를 만들었지 만 (많은 에러에 대해서는 안전하지 않고 검사하지 않습니다), 일반적인 자바 프로그램을 프로그래밍하는 사람 만이 파일 유형을 찾을 정도로 충분합니다. 이것은 복잡한 파일 형식에서는 작동하지 않지만 일반적으로 많이 사용되지는 않습니다.

    public static String getFileType(String path){
       String fileType = null;
       fileType = path.substring(path.indexOf('.',path.lastIndexOf('/'))+1).toUpperCase();
       return fileType;
}



다음은 디렉토리 이름에 점이있는 경로에서도 .tar.gz 올바르게 처리하는 방법입니다.

private static final String getExtension(final String filename) {
  if (filename == null) return null;
  final String afterLastSlash = filename.substring(filename.lastIndexOf('/') + 1);
  final int afterLastBackslash = afterLastSlash.lastIndexOf('\\') + 1;
  final int dotIndex = afterLastSlash.indexOf('.', afterLastBackslash);
  return (dotIndex == -1) ? "" : afterLastSlash.substring(dotIndex + 1);
}

afterLastSlashafterLastBackslash 슬래시가있는 경우 전체 문자열을 검색 할 필요가 없기 때문에 afterLastBackslash 빨리 찾을 수 있도록 작성됩니다.

원래의 String 내부의 char[] 는 재사용되고 거기에 가비지가 추가되지 않으며 , JVM은 afterLastSlash 가 힙 대신 스택에 저장하기 위해 즉시 쓰레기임을 알 수 있습니다.




반환 값으로 Optional을 가진 버전은 다음과 같습니다 (파일에 확장명이 없음을 알 수 없으므로 ...)

import java.io.File;
import java.util.Optional;

public class GetFileExtensionTool {

    public static Optional<String> getFileExtension(File file) {
        if (file == null) {
            throw new NullPointerException("file argument was null");
        }
        if (!file.isFile()) {
            throw new IllegalArgumentException("getFileExtension(File file)"
                    + " called on File object that wasn't an actual file"
                    + " (perhaps a directory or device?). file had path: "
                    + file.getAbsolutePath());
        }
        String fileName = file.getName();
        int i = fileName.lastIndexOf('.');
        if (i > 0) {
            return Optional.of(fileName.substring(i + 1));
        } else {
            return Optional.empty();
        }
    }
}



Java에는 java.nio.file.Files 클래스 에서 사용자의 필요에 따라 사용할 수있는 내장 된 방법이 있습니다.

File f = new File("/path/to/file/foo.txt");
String ext = Files.probeContentType(f.toPath());
if(ext.equalsIgnoreCase("txt")) do whatever;

이 정적 메서드는 여기 에있는 사양을 사용하여 다를 수있는 "콘텐츠 형식"을 검색합니다.




Related



Tags

java java   file   io