programing

자바 : 파일 이름을 기본 및 확장으로 분할

nasanasas 2020. 10. 13. 07:53
반응형

자바 : 파일 이름을 기본 및 확장으로 분할


이 질문에 이미 답변이 있습니다.

파일 기본 이름과 확장자를 얻는 더 좋은 방법이 있습니까?

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

반응형