簡體   English   中英

Java:將文件名拆分為基本文件名和擴展名

[英]Java: splitting the filename into a base and extension

有沒有比類似的更好的方法來獲取文件基名和擴展名

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 在任何句點之后進行拆分,然后是任意數量的非句點,然后是輸入的結尾。 只有一個周期符合這個定義(即最后一個周期)。

從技術上 正則說,這種技術被稱為零寬度正向前瞻


順便說一句,如果您想拆分路徑並獲取完整的文件名,包括但不限於點擴展名,請使用帶正斜杠的路徑,

    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());
  }
}

http://docs.oracle.com/javase/6/docs/api/java/io/File.html#getName()

來自http://www.xinotes.org/notes/note/774/

Java 有內置函數來獲取給定文件路徑的 basename 和 dirname,但函數名並不那么明顯。

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文件“擴展名”正在使用中。 但是,您將如何決定是在最后一個點還是倒數第二個點進行拆分?

請改用 MIME 類型。

Java 7 函數Files.probeContentType可能比信任文件擴展名更可靠地檢測文件類型。 幾乎所有的 Unix/Linux 世界以及您的網絡瀏覽器和智能手機都已經這樣做了。

你的代碼有什么問題? 包裹在一個整潔的實用方法中,這很好。

更重要的是使用什么作為分隔符——第一個或最后一個點。 第一個對“setup-2.5.1.exe”這樣的文件名不利,最后一個對具有多個擴展名的文件名(如“mybundle.tar.gz”)不利。

您還可以使用 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" }

所以你會知道數組中的最后一個索引是擴展名,所有其他索引都是基數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM