자바에서 확장자를 사용하지 않고 파일 이름을 가져오려면 어떻게 해야 합니까?
확장자를 붙이지 않고 파일 이름을 얻는 방법을 가르쳐 주실 수 있나요?예:
fileNameWithExt = "test.xml";
fileNameWithOutExt = "test";
저처럼 파일명이 아닌 경로에서 늘 또는 닷을 전달하면 어떻게 되는지와 같이 모든 특수한 경우를 생각할 수 있는 라이브러리 코드를 사용하는 것이 좋습니다.
import org.apache.commons.io.FilenameUtils;
String fileNameWithOutExt = FilenameUtils.removeExtension(fileNameWithExt);
가장 쉬운 방법은 정규 표현을 사용하는 것입니다.
fileNameWithOutExt = "test.xml".replaceFirst("[.][^.]+$", "");
위의 식을 사용하면 마지막 점 뒤에 하나 이상의 문자가 삭제됩니다.여기 기본 단위 테스트가 있습니다.
public void testRegex() {
assertEquals("test", "test.xml".replaceFirst("[.][^.]+$", ""));
assertEquals("test.2", "test.2.xml".replaceFirst("[.][^.]+$", ""));
}
제 취향에 따른 통합 리스트 오더입니다.
Apache Commons 사용
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);
또는 코어 Java 사용
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);
}
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("");
}
라이프레이 API
import com.liferay.portal.kernel.util.FileUtil;
String fileName = FileUtil.stripExtension(file.getName());
다음 테스트 프로그램을 참조하십시오.
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
프로젝트에서 Guava(14.0 이후)를 사용하는 경우 로 진행할 수 있습니다.
으로 (본질)와 )FilenameUtils.removeExtension()Apache Commons IO에서 얻을 수 있습니다.구아바가 이런 짓을 한다는 걸 지적하고 싶었어요개인적으로 나는 단지 이것 때문에 Commons에 대한 의존을 늘리고 싶지 않았다.-내가 느끼기에는 조금 유물이 되었다.)
다음은 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 를 Import 하고 싶지 않은 경우는, 같은 기능을 추출했습니다.
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로 모바일 앱으로서는 눈에 띄게 큽니다.
소스 코드를 다운로드하여 Filename Utils 클래스를 보면 많은 추가 유틸리티가 있음을 알 수 있으며 Windows 및 Unix 경로를 모두 처리할 수 있습니다.
단, 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;
}
파일명에 확장자용 닷이1개밖에 없는 경우 Java split 함수를 사용하여 확장자에서 파일 이름을 분할할 수 있습니다.
File filename = new File('test.txt'); File.getName().split("[.]");
그래서 그split[0]"test"를 반환하고 split [1]를 반환하면 "txt"가 반환됩니다.
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("."));
}
상대 경로 또는 전체 경로에서 이름을 얻는 가장 간단한 방법은
import org.apache.commons.io.FilenameUtils; FilenameUtils.getBaseName(definitionFilePath)
Kotlin은 다음과 같이 심플하게 되었습니다.
val fileNameStr = file.nameWithoutExtension
fileEntry.getName().substring(0, fileEntry.getName().lastIndexOf("."));
지정된 문자열filename, 다음을 수행할 수 있습니다.
String filename = "test.xml";
filename.substring(0, filename.lastIndexOf(".")); // Output: test
filename.split("\\.")[0]; // Output: test
유창한 방법:
public static String fileNameWithOutExt (String fileName) {
return Optional.of(fileName.lastIndexOf(".")).filter(i-> i >= 0)
.filter(i-> i > fileName.lastIndexOf(File.separator))
.map(i-> fileName.substring(0, i)).orElse(fileName);
}
"."로 분할할 수 있습니다.인덱스 0은 파일명, 확장자는 1이지만 첫 번째 기사에서 언급한 것처럼 apache.commons-io에서 FileNameUtils를 사용하는 최적의 솔루션을 원합니다.제거할 필요는 없지만 다음과 같이 충분합니다.
String fileName = FilenameUtils.getBaseName("test.xml");
사용하다FilenameUtils.removeExtensionApache Commons IO에서
예:
전체 경로 이름을 제공하거나 파일 이름만 제공할 수 있습니다.
String myString1 = FilenameUtils.removeExtension("helloworld.exe"); // returns "helloworld"
String myString2 = FilenameUtils.removeExtension("/home/abc/yey.xls"); // returns "yey"
이것이 도움이 되길 바랍니다.
단순하게 하기 위해 다음과 같이 Java의 String.replaceAll() 메서드를 사용합니다.
String fileNameWithExt = "test.xml";
String fileNameWithoutExt
= fileNameWithExt.replaceAll( "^.*?(([^/\\\\\\.]+))\\.[^\\.]+$", "$1" );
fileNameWithExt에 완전 수식 경로가 포함되어 있는 경우에도 작동합니다.
나의 솔루션에는 다음과 같은 Import가 필요합니다.
import java.io.File;
다음 메서드는 원하는 출력 문자열을 반환합니다.
private static String getFilenameWithoutExtension(File file) throws IOException {
String filename = file.getCanonicalPath();
String filenameWithoutExtension;
if (filename.contains("."))
filenameWithoutExtension = filename.substring(filename.lastIndexOf(System.getProperty("file.separator"))+1, filename.lastIndexOf('.'));
else
filenameWithoutExtension = filename.substring(filename.lastIndexOf(System.getProperty("file.separator"))+1);
return filenameWithoutExtension;
}
com.google.common.io 를 참조해 주세요.파일
Files.getNameWithout Extension(source File.getName())
일도 할 수 있다
다음 코드를 사용해 보십시오.핵심 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줄들.
언급URL : https://stackoverflow.com/questions/924394/how-to-get-the-filename-without-the-extension-in-java
'programing' 카테고리의 다른 글
| v-model이 jQuery 트리거 이벤트의 변경 사항을 감지하지 못함 (0) | 2022.07.17 |
|---|---|
| 유형 'Vue'에 속성 'x'가 없습니다. (0) | 2022.07.17 |
| ESLint VueJS v-slot (0) | 2022.07.17 |
| 차이점은 무엇입니까? clang++ | clang - std = c++11 (0) | 2022.07.17 |
| Vue array.splice 목록에서 잘못된 항목 제거 (0) | 2022.07.17 |