Java에서 접미사를 자르는 가장 효율적인 방법은 다음과 같습니다.
title part1.txt
title part2.html
=>
title part1
title part2
Java에서 접미사를 자르는 가장 효율적인 방법은 다음과 같습니다.
title part1.txt
title part2.html
=>
title part1
title part2
답변:
이것은 우리가 직접해서는 안되는 일종의 코드입니다. 평범한 물건을 위해 라이브러리를 사용하고 어려운 물건을 위해 두뇌를 구하십시오.
이 경우 Apache Commons IO 에서 FilenameUtils.removeExtension () 을 사용하는 것이 좋습니다.
str.substring(0, str.lastIndexOf('.'))
if(str.contains("."))
str.substring(0, str.lastIndexOf('.'))
를 사용으로 String.substring
하고 String.lastIndex
한 라이너가 좋은에서 특정 파일 경로에 대처 할 수있는 측면에서 몇 가지 문제가 있습니다.
다음 경로를 예로 들어 보겠습니다.
a.b/c
하나의 라이너를 사용하면 다음과 같은 결과가 발생합니다.
a
맞습니다.
결과는 c
였지만 파일의 확장자는 없었지만 경로 .
에 이름 이 포함 된 디렉토리가 있으므로 one-liner 메소드가 경로의 일부를 파일 이름으로 제공하도록 속이는 것은 정확하지 않습니다.
점검 필요
skaffman의 답변 에서 영감을 받아 Apache Commons IO 의 FilenameUtils.removeExtension
방법을 살펴 보았습니다 .
동작을 재현하기 위해 새로운 방법이 수행해야 할 몇 가지 테스트를 작성했습니다.
경로 파일 이름 -------------- -------- a / b / cc a / b / c.jpg c a / b / c.jpg.jpg c.jpg ab / cc ab / c.jpg c ab / c.jpg.jpg c.jpg cc c.jpg c c.jpg.jpg c.jpg
(그리고 이것이 내가 확인한 전부입니다. 아마도 간과해야 할 다른 점검이있을 것입니다.)
구현
다음은 removeExtension
메소드 구현입니다 .
public static String removeExtension(String s) {
String separator = System.getProperty("file.separator");
String filename;
// Remove the path upto the filename.
int lastSeparatorIndex = s.lastIndexOf(separator);
if (lastSeparatorIndex == -1) {
filename = s;
} else {
filename = s.substring(lastSeparatorIndex + 1);
}
// Remove the extension.
int extensionIndex = filename.lastIndexOf(".");
if (extensionIndex == -1)
return filename;
return filename.substring(0, extensionIndex);
}
removeExtension
위의 테스트 로이 방법을 실행 하면 위에 나열된 결과가 생성됩니다.
이 방법은 다음 코드로 테스트되었습니다. 이것이 Windows에서 실행되었으므로 경로 구분 기호는 리터럴의 일부로 사용될 때 \
이스케이프 처리해야합니다 .\
String
System.out.println(removeExtension("a\\b\\c"));
System.out.println(removeExtension("a\\b\\c.jpg"));
System.out.println(removeExtension("a\\b\\c.jpg.jpg"));
System.out.println(removeExtension("a.b\\c"));
System.out.println(removeExtension("a.b\\c.jpg"));
System.out.println(removeExtension("a.b\\c.jpg.jpg"));
System.out.println(removeExtension("c"));
System.out.println(removeExtension("c.jpg"));
System.out.println(removeExtension("c.jpg.jpg"));
결과는 다음과 같습니다.
c
c
c.jpg
c
c
c.jpg
c
c
c.jpg
결과는 방법이 충족해야하는 테스트에 요약 된 원하는 결과입니다.
System.getProperty("file.separator")
그냥하고 File.separator
?
/path/to/.htaccess
String foo = "title part1.txt";
foo = foo.substring(0, foo.lastIndexOf('.'));
com.google.common.io.Files
프로젝트가 이미 Google 핵심 라이브러리에 의존하는 경우 클래스 의 메소드를 사용하십시오 . 필요한 방법은 getNameWithoutExtension
입니다.
그러나 마지막 결과 진술을 다음과 같이 변경했습니다.
if (extensionIndex == -1)
return s;
return s.substring(0, lastSeparatorIndex+1)
+ filename.substring(0, extensionIndex);
전체 경로 이름을 반환하고 싶었습니다.
따라서 "C : \ Users \ mroh004.COM \ Documents \ Test \ Test.xml"이됩니다. "C : \ Users \ mroh004.COM \ Documents \ Test \ Test"가 아닌 "테스트"
문자열 이미지 경로로 새 파일을 만듭니다.
String imagePath;
File test = new File(imagePath);
test.getName();
test.getPath();
getExtension(test.getName());
public static String getExtension(String uri) {
if (uri == null) {
return null;
}
int dot = uri.lastIndexOf(".");
if (dot >= 0) {
return uri.substring(dot);
} else {
// No extension.
return "";
}
}
org.apache.commons.io.FilenameUtils 버전 2.4는 다음과 같은 답변을 제공합니다.
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);
}
}
public static int indexOfExtension(String filename) {
if (filename == null) {
return -1;
}
int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);
int lastSeparator = indexOfLastSeparator(filename);
return lastSeparator > extensionPos ? -1 : extensionPos;
}
public static int indexOfLastSeparator(String filename) {
if (filename == null) {
return -1;
}
int lastUnixPos = filename.lastIndexOf(UNIX_SEPARATOR);
int lastWindowsPos = filename.lastIndexOf(WINDOWS_SEPARATOR);
return Math.max(lastUnixPos, lastWindowsPos);
}
public static final char EXTENSION_SEPARATOR = '.';
private static final char UNIX_SEPARATOR = '/';
private static final char WINDOWS_SEPARATOR = '\\';
나는 이것을 좋아할 것이다 :
String title_part = "title part1.txt";
int i;
for(i=title_part.length()-1 ; i>=0 && title_part.charAt(i)!='.' ; i--);
title_part = title_part.substring(0,i);
'.'까지 끝까지 시작 그런 다음 하위 문자열을 호출하십시오.
편집 : 골프는 아니지만 효과적입니다 :)
파일 확장자가 없거나 둘 이상의 파일 확장자가있는 시나리오를 명심하십시오.
예 Filename : 파일 | file.txt | file.tar.bz2
/**
*
* @param fileName
* @return file extension
* example file.fastq.gz => fastq.gz
*/
private String extractFileExtension(String fileName) {
String type = "undefined";
if (FilenameUtils.indexOfExtension(fileName) != -1) {
String fileBaseName = FilenameUtils.getBaseName(fileName);
int indexOfExtension = -1;
while (fileBaseName.contains(".")) {
indexOfExtension = FilenameUtils.indexOfExtension(fileBaseName);
fileBaseName = FilenameUtils.getBaseName(fileBaseName);
}
type = fileName.substring(indexOfExtension + 1, fileName.length());
}
return type;
}
String img = "example.jpg";
// String imgLink = "http://www.example.com/example.jpg";
URI uri = null;
try {
uri = new URI(img);
String[] segments = uri.getPath().split("/");
System.out.println(segments[segments.length-1].split("\\.")[0]);
} catch (Exception e) {
e.printStackTrace();
}
이 뜻 출력 예를 모두 IMG 와 imgLink
public static String removeExtension(String file) {
if(file != null && file.length() > 0) {
while(file.contains(".")) {
file = file.substring(0, file.lastIndexOf('.'));
}
}
return file;
}
file.length() > 0
수표의 목적은 무엇입니까 ?