1. 개요
2. 파일 이름에서 확장자를 제거하는 시나리오
- 확장자 없이 " baeldung"
- 단일 확장자를 사용하는 경우 가장 일반적인 경우입니다(예: " baeldung.txt ").
- " baeldung.tar.gz " 와 같은 여러 확장자 사용
- " .baeldung " 과 같이 확장자가 없는 Dotfile
- 단일 확장자를 가진 Dotfile(예: " .baeldung.conf "
- 확장자가 여러 개인 Dotfile(예: " .baeldung.conf.bak ")
- " baeldung ": 파일 이름에 확장자가 없습니다. 따라서 파일 이름을 변경해서는 안 되며 " baeldung "을 얻어야 합니다 .
- " baeldung.txt ": 이것은 간단한 경우입니다. 정확한 결과는 " baeldung " 입니다.
- " baeldung.tar.gz ": 이 파일 이름은 두 개의 확장자를 포함합니다. 확장자를 하나만 제거하려면 " baeldung.tar "가 결과여야 합니다. 그러나 파일 이름에서 모든 확장자를 제거하려면 " baeldung "이 올바른 결과입니다.
- " .baeldung ": 이 파일 이름도 확장자가 없으므로 파일 이름도 변경해서는 안 됩니다. 따라서 결과에 " .baeldung " 이 표시될 것으로 예상됩니다.
- " .baeldung.conf ": 결과는 " .baeldung " 이어야 합니다.
- " .baeldung.conf.bak ": 확장자를 하나만 제거하려면 결과가 ".baeldung.conf"여야 합니다. 그렇지 않으면 " .baeldung "이 모든 확장자를 제거하는 경우 예상되는 출력입니다.
3. 구아바 라이브러리 테스트
Files.getNameWithoutExtension()
메서드를 도입했습니다 . 이를 통해 주어진 파일 이름에서 확장자를 쉽게 제거할 수 있습니다.유틸리티 메서드를 사용하려면 클래스 경로에 Guava 라이브러리를 추가해야 합니다. 예를 들어 Maven을 빌드 도구로 사용하는 경우 pom.xml 파일에 을 추가할 수 있습니다 .<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.0-jre</version>
</dependency>
먼저 이 메서드의 구현을 살펴보겠습니다.
public static String getNameWithoutExtension(String file) {
...
int dotIndex = fileName.lastIndexOf('.');
return (dotIndex == -1) ? fileName : fileName.substring(0, dotIndex);
}
구현은 매우 간단합니다. 파일 이름에 점이 포함된 경우 메서드는 마지막 점에서 파일 이름 끝까지 잘라냅니다. 그렇지 않고 파일 이름에 점이 포함되어 있지 않으면 변경 없이 원래 파일 이름이 반환됩니다.따라서
Guava의 getNameWithoutExtension() 메서드는 확장자가 없는 도트 파일에 대해 작동하지 않습니다.
다음을 증명하는 테스트를 작성해 보겠습니다.@Test
public void givenDotFileWithoutExt_whenCallGuavaMethod_thenCannotGetDesiredResult() {
//negative assertion
assertNotEquals(".baeldung", Files.getNameWithoutExtension(".baeldung"));
}
확장자가 여러 개인 파일 이름을 처리할 때
이 방법은 파일 이름에서 모든 확장자를 제거하는 옵션을 제공하지 않습니다.
@Test
public void givenFileWithoutMultipleExt_whenCallGuavaMethod_thenCannotRemoveAllExtensions() {
//negative assertion
assertNotEquals("baeldung", Files.getNameWithoutExtension("baeldung.tar.gz"));
}
4. Apache Commons IO 라이브러리 테스트
파일
이름 확장자를 빠르게 제거합니다.pom.xml에
추가해 보겠습니다 .<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
구현은 Guava의
getNameWithoutExtension()
메서드 와 유사합니다 .public static String removeExtension(final String filename) {
...
final int index = indexOfExtension(filename); //used the String.lastIndexOf() method
if (index == NOT_FOUND) {
return filename;
} else {
return filename.substring(0, index);
}
}
따라서
Apache Commons IO의 방법은 dotfile에서도 작동하지 않습니다
.@Test
public void givenDotFileWithoutExt_whenCallApacheCommonsMethod_thenCannotGetDesiredResult() {
//negative assertion
assertNotEquals(".baeldung", FilenameUtils.removeExtension(".baeldung"));
}
파일 이름에 확장자가 여러 개인 경우 removeExtension() 메서드는 모든 확장자를 제거할 수 없습니다.
@Test
public void givenFileWithoutMultipleExt_whenCallApacheCommonsMethod_thenCannotRemoveAllExtensions() {
//negative assertion
assertNotEquals("baeldung", FilenameUtils.removeExtension("baeldung.tar.gz"));
}
5. 파일 이름에서 확장자 제거
- dotfile 에서는 작동하지 않습니다(예: " .baeldung "
- 파일 이름에 여러 확장자가 있는 경우 마지막 확장자만 제거하거나 모든 확장자를 제거하는 옵션을 제공하지 않습니다.
public static String removeFileExtension(String filename, boolean removeAllExtensions) {
if (filename == null || filename.isEmpty()) {
return filename;
}
String extPattern = "(?<!^)[.]" + (removeAllExtensions ? ".*" : "[^.]*$");
return filename.replaceAll(extPattern, "");
}
모든 확장자를 제거하거나 파일 이름에서 마지막 확장자만 제거하는 옵션을 제공하기 위해
부울
매개변수removeAllExtensions
를 추가했습니다 .정규식
패턴 이 무엇을 하는지 이해해 봅시다 .- “(?<!^)[.]” – 이 정규식 에서 부정 lookbehind 를 사용합니다 . 점"과 일치합니다 . "는 파일 이름의 시작 부분에 있지 않습니다.
- " (?<!^)[.].* " - removeAllExtensions 옵션이 설정되어 있으면 파일 이름이 끝날 때까지 첫 번째로 일치하는 점과 일치합니다.
- “ (?<!^)[.][^.]*$ ” – 이 패턴은 마지막 확장자에만 일치합니다.
@Test
public void givenFilenameNoExt_whenCallFilenameUtilMethod_thenGetExpectedFilename() {
assertEquals("baeldung", MyFilenameUtil.removeFileExtension("baeldung", true));
assertEquals("baeldung", MyFilenameUtil.removeFileExtension("baeldung", false));
}
@Test
public void givenSingleExt_whenCallFilenameUtilMethod_thenGetExpectedFilename() {
assertEquals("baeldung", MyFilenameUtil.removeFileExtension("baeldung.txt", true));
assertEquals("baeldung", MyFilenameUtil.removeFileExtension("baeldung.txt", false));
}
@Test
public void givenDotFile_whenCallFilenameUtilMethod_thenGetExpectedFilename() {
assertEquals(".baeldung", MyFilenameUtil.removeFileExtension(".baeldung", true));
assertEquals(".baeldung", MyFilenameUtil.removeFileExtension(".baeldung", false));
}
@Test
public void givenDotFileWithExt_whenCallFilenameUtilMethod_thenGetExpectedFilename() {
assertEquals(".baeldung", MyFilenameUtil.removeFileExtension(".baeldung.conf", true));
assertEquals(".baeldung", MyFilenameUtil.removeFileExtension(".baeldung.conf", false));
}
@Test
public void givenDoubleExt_whenCallFilenameUtilMethod_thenGetExpectedFilename() {
assertEquals("baeldung", MyFilenameUtil.removeFileExtension("baeldung.tar.gz", true));
assertEquals("baeldung.tar", MyFilenameUtil.removeFileExtension("baeldung.tar.gz", false));
}
@Test
public void givenDotFileWithDoubleExt_whenCallFilenameUtilMethod_thenGetExpectedFilename() {
assertEquals(".baeldung", MyFilenameUtil.removeFileExtension(".baeldung.conf.bak", true));
assertEquals(".baeldung.conf", MyFilenameUtil.removeFileExtension(".baeldung.conf.bak", false));
}