자바 : 파일 이름을 기본 및 확장으로 분할
이 질문에 이미 답변이 있습니다.
파일 기본 이름과 확장자를 얻는 더 좋은 방법이 있습니까?
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());
}
}
파일 확장자는 깨진 개념입니다
그리고 그것에 대한 신뢰할 수있는 기능 이 없습니다. 예를 들어 다음 파일 이름을 고려하십시오.
archive.tar.gz
확장 은 무엇입니까 ? DOS 사용자는 이름을 선호했을 것 archive.tgz
입니다. 때때로 파일의 압축을 풀고 (파일을 생성하는 ) 어리석은 Windows 응용 프로그램을 본 .tar
다음 아카이브 내용을 보려면 다시 열어야합니다.
In this case, a more reasonable notion of file extension would have been .tar.gz
. There are also .tar.bz2
, .tar.xz
, .tar.lz
and .tar.lzma
file "extensions" in use. But how would you decide, whether to split at the last dot, or the second-to-last dot?
Use mime-types instead.
The Java 7 function Files.probeContentType will likely be much more reliable to detect file types than trusting the file extension. Pretty much all the Unix/Linux world as well as your Webbrowser and Smartphone already does it this way.
http://docs.oracle.com/javase/6/docs/api/java/io/File.html#getName()
From http://www.xinotes.org/notes/note/774/ :
Java has built-in functions to get the basename and dirname for a given file path, but the function names are not so self-apparent.
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());
}
}
What's wrong with your code? Wrapped in a neat utility method it's fine.
What's more important is what to use as separator — the first or last dot. The first is bad for file names like "setup-2.5.1.exe", the last is bad for file names with multiple extensions like "mybundle.tar.gz".
You can also user java Regular Expression. String.split() also uses the expression internally. Refer http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html
Maybe you could use String#split
To answer your comment:
I'm not sure if there can be more than one . in a filename, but whatever, even if there are more dots you can use the split. Consider e.g. that:
String input = "boo.and.foo";
String[] result = input.split(".");
This will return an array containing:
{ "boo", "and", "foo" }
So you will know that the last index in the array is the extension and all others are the base.
참고URL : https://stackoverflow.com/questions/4545937/java-splitting-the-filename-into-a-base-and-extension
'programing' 카테고리의 다른 글
Android의 SharedPreferences에 배열 또는 객체를 추가 할 수 있습니까? (0) | 2020.10.13 |
---|---|
Java에서 다차원 배열 초기화 (0) | 2020.10.13 |
Scala에서 인덱스를 사용한 효율적인 반복 (0) | 2020.10.13 |
Rails의 컨트롤러에서 레코드가 있는지 확인하십시오. (0) | 2020.10.13 |
Django : 인증 사용자를 모델로 가져 오기 (0) | 2020.10.13 |