파일 기본 이름과 확장자를 얻는 더 좋은 방법이 있습니까?
File f = ...
String name = f.getName();
int dot = name.lastIndexOf('.');
String base = (dot == -1) ? name : name.substring(0, dot);
String extension = (dot == -1) ? "" : name.substring(dot+1);
파일 기본 이름과 확장자를 얻는 더 좋은 방법이 있습니까?
File f = ...
String name = f.getName();
int dot = name.lastIndexOf('.');
String base = (dot == -1) ? name : name.substring(0, dot);
String extension = (dot == -1) ? "" : name.substring(dot+1);
답변:
다른 사람들이 언급 한 것을 알고 String.split
있지만 여기에는 두 개의 토큰 (기본 및 확장) 만 생성하는 변형이 있습니다 .
String[] tokens = fileName.split("\\.(?=[^\\.]+$)");
예를 들면 :
"test.cool.awesome.txt".split("\\.(?=[^\\.]+$)");
수율 :
["test.cool.awesome", "txt"]
정규식은 Java가 임의의 수의 비 기간이 뒤 따르고 입력이 끝나는 기간을 분할하도록 지시합니다. 이 정의와 일치하는 기간이 하나뿐입니다 (즉, 마지막 기간).
기술적으로 정규적으로 말하면이 기술을 폭이 0 인 긍정 예측 이라고 합니다 .
BTW, 경로를 분할하고 슬래시가있는 경로를 사용하여 점 확장자를 포함하지만 이에 국한되지 않는 전체 파일 이름을 얻으려면,
String[] tokens = dir.split(".+?/(?=[^/]+$)");
예를 들면 :
String dir = "/foo/bar/bam/boozled";
String[] tokens = dir.split(".+?/(?=[^/]+$)");
// [ "/foo/bar/bam/" "boozled" ]
오래된 질문이지만 일반적으로이 솔루션을 사용합니다.
import org.apache.commons.io.FilenameUtils;
String fileName = "/abc/defg/file.txt";
String basename = FilenameUtils.getBaseName(fileName);
String extension = FilenameUtils.getExtension(fileName);
System.out.println(basename); // file
System.out.println(extension); // txt (NOT ".txt" !)
출처 : http://www.java2s.com/Code/Java/File-Input-Output/Getextensionpathandfilename.htm
그러한 유틸리티 클래스 :
class Filename {
private String fullPath;
private char pathSeparator, extensionSeparator;
public Filename(String str, char sep, char ext) {
fullPath = str;
pathSeparator = sep;
extensionSeparator = ext;
}
public String extension() {
int dot = fullPath.lastIndexOf(extensionSeparator);
return fullPath.substring(dot + 1);
}
public String filename() { // gets filename without extension
int dot = fullPath.lastIndexOf(extensionSeparator);
int sep = fullPath.lastIndexOf(pathSeparator);
return fullPath.substring(sep + 1, dot);
}
public String path() {
int sep = fullPath.lastIndexOf(pathSeparator);
return fullPath.substring(0, sep);
}
}
용법:
public class FilenameDemo {
public static void main(String[] args) {
final String FPATH = "/home/mem/index.html";
Filename myHomePage = new Filename(FPATH, '/', '.');
System.out.println("Extension = " + myHomePage.extension());
System.out.println("Filename = " + myHomePage.filename());
System.out.println("Path = " + myHomePage.path());
}
}
basename()
더 좋은 이름이 아닌 것filename()
http://docs.oracle.com/javase/6/docs/api/java/io/File.html#getName ()
에서 http://www.xinotes.org/notes/note/774/ :
Java에는 주어진 파일 경로에 대한 기본 이름과 디렉토리 이름을 가져 오는 내장 함수가 있지만 함수 이름이 그렇게 명확하지는 않습니다.
import java.io.File;
public class JavaFileDirNameBaseName {
public static void main(String[] args) {
File theFile = new File("../foo/bar/baz.txt");
System.out.println("Dirname: " + theFile.getParent());
System.out.println("Basename: " + theFile.getName());
}
}
그리고 그것에 대한 신뢰할 수있는 기능 이 없습니다. 예를 들어 다음 파일 이름을 고려하십시오.
archive.tar.gz
확장 은 무엇입니까 ? DOS 사용자는 이름을 선호했을 것 archive.tgz
입니다. 때로는 파일을 먼저 압축 해제 (파일 생성)하는 어리석은 Windows 응용 프로그램을 본 .tar
다음 아카이브 내용을 보려면 다시 열어야합니다.
이 경우 파일 확장자에 대한보다 합리적인 개념은 .tar.gz
. 이 또한 .tar.bz2
, .tar.xz
, .tar.lz
및 .tar.lzma
파일 "확장자"를 사용한다. 그러나 마지막 점에서 분할할지 아니면 마지막 점에서 두 번째 점에서 분할할지 어떻게 결정할까요?
Java 7 함수 Files.probeContentType 은 파일 확장자를 신뢰하는 것보다 파일 유형을 감지하는 데 훨씬 더 신뢰할 수 있습니다. 웹 브라우저와 스마트 폰뿐만 아니라 거의 모든 유닉스 / 리눅스 세계는 이미 이런 식으로하고 있습니다.
File
놓지 Path
말자.
.tar.gz
대 .tgz
유닉스에 너무 공통). 대신 MIME 유형을 사용하십시오.
Files.probeContentType
올바른 확장자를 갖기 위해 파일 이름에 의존하는 대신 사용하는 데 문제가 있습니까?
Java 정규식을 사용할 수도 있습니다. String.split ()도 내부적으로 표현식을 사용합니다. http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html을 참조 하십시오.
아마도 String # split을 사용할 수 있습니다 .
귀하의 의견에 답변하려면 :
둘 이상이있을 수 있는지 잘 모르겠습니다. 파일 이름에 있지만 더 많은 점이 있더라도 분할을 사용할 수 있습니다. 예를 들어 다음을 고려하십시오.
String input = "boo.and.foo";
String[] result = input.split(".");
다음을 포함하는 배열이 반환됩니다.
{ "boo", "and", "foo" }
따라서 배열의 마지막 인덱스가 확장이고 다른 모든 인덱스가 기본임을 알 수 있습니다.
.
문자열 에서 마지막 정규식을 찾아야 합니다
fileName.split("\\.(?=[^\\.]+$)")
FilenameUtils
. 그것은이getBaseName(..)
와getExtension(..)
방법을.