분명히하기 위해 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"));
}