답변:
나처럼, 파일 이름이 아닌 경로 에 null 또는 점 을 전달하면 발생하는 것과 같은 모든 특수 사례를 생각한 라이브러리 코드 를 사용하려는 경우 다음을 사용할 수 있습니다.
import org.apache.commons.io.FilenameUtils;
String fileNameWithOutExt = FilenameUtils.removeExtension(fileNameWithExt);
java.nio.file.Files
와 Path
- 같은 파일 이름 만 받고 해결하는 기본 디렉토리, 한 줄의 복사 / 이동 파일로 등
가장 쉬운 방법은 정규식을 사용하는 것입니다.
fileNameWithOutExt = "test.xml".replaceFirst("[.][^.]+$", "");
위의 표현은 마지막 점과 하나 이상의 문자를 제거합니다. 기본 단위 테스트는 다음과 같습니다.
public void testRegex() {
assertEquals("test", "test.xml".replaceFirst("[.][^.]+$", ""));
assertEquals("test.2", "test.2.xml".replaceFirst("[.][^.]+$", ""));
}
org.apache.commons
. 내가 아는 한, 이것이 안드로이드에서 할 수있는 유일한 방법입니다.
다음 테스트 프로그램을 참조하십시오.
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
당신이 원하는지 알 수 있습니다.
foo.tar.gz
는 gzipped 버전 foo.tar
이므로 gz
확장 이라고 주장 할 수 있습니다 . 모두 확장을 정의하는 방법에 달려 있습니다.
.gitignore
합니까?
내 선호도에 따른 통합 목록 순서는 다음과 같습니다.
아파치 커먼즈 사용하기
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());
프로젝트에서 Guava (14.0 이상)를 사용하는 경우을 사용할 수 있습니다 Files.getNameWithoutExtension()
.
( 가장 높은 투표 응답에서 알 수 있듯이 FilenameUtils.removeExtension()
Apache Commons IO 와 본질적으로 동일 합니다. 구아바도 마찬가지라고 지적하고 싶었습니다. 개인적으로 저는 Commons에 의존성을 추가하고 싶지 않았습니다. 이것 때문에.)
FilenameUtils.getBaseName()
아래는 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);
}
}
전체 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;
}
}
}
필자는 라이브러리 재사용에 대해 큰 신념을 가지고 있지만 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;
}
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("."));
}
Apache Commons IOFilenameUtils.removeExtension
에서 사용
예:
전체 경로 이름 또는 파일 이름 만 제공 할 수 있습니다 .
String myString1 = FilenameUtils.removeExtension("helloworld.exe"); // returns "helloworld"
String myString2 = FilenameUtils.removeExtension("/home/abc/yey.xls"); // returns "yey"
도움이 되었기를 바랍니다 ..
아래 코드를 사용해보십시오. 핵심 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
문자열 과 함께 작동하도록 조정할 수 있습니다 .
.
document.docx.backup