Làm cách nào để có được phần mở rộng tệp của một tệp trong Java?


484

Nói rõ hơn, tôi không tìm kiếm loại MIME.

Giả sử tôi có đầu vào sau: /path/to/file/foo.txt

Tôi muốn một cách để phá vỡ đầu vào này, đặc biệt là .txtcho phần mở rộng. Có cách xây dựng nào để làm điều này trong Java không? Tôi muốn tránh viết trình phân tích cú pháp của riêng tôi.


12
Bạn không bao giờ biết khi nào một số nền tảng mới sẽ xuất hiện, định nghĩa các tiện ích mở rộng được phân tách bằng dấu phẩy. Bây giờ bạn cần phải viết mã phụ thuộc nền tảng. Các khung công tác Java nên có tư duy tiến bộ hơn và có các API để nhận các tiện ích mở rộng nơi chúng viết mã phụ thuộc nền tảng và bạn, với tư cách là người dùng API, chỉ cần nói có được tiện ích mở rộng.
ArtOfWarfare

@ArtOfWarfare: OMG. Hãy tạo một 100MB JRE với nhiều ngàn lớp nhưng hãy chắc chắn để không thực hiện bất kỳ phương pháp mà lợi nhuận "txt"từ "filename.txt"bởi vì một số nền tảng ở đâu đó có thể muốn sử dụng "filename,txt".
Eric Duminil

@EricDuminil "Hãy chắc chắn không thực hiện bất kỳ phương thức nào trả về" txt "từ" filename.txt "" ??? Hãy thử path.substring(path.lastIndexOf("."));..... Và vâng .. Họ chắc chắn sẽ không sao chép thứ gì đó chẳng vì gì cả ...
VelocityPulse

@VelocityPulse Đó chính xác là điều làm phiền tôi. Vì không có cách chuẩn để có được phần mở rộng tệp, bạn nhận được hàng tá câu trả lời sai một nửa và cách triển khai hơi khác nhau. Mã của bạn sử dụng 2 phương thức (tôi muốn có một phương thức rõ ràng duy nhất), nó trả về ".txt"từ "filename.txt"đó, có thể không phải là kết quả mong muốn và tệ nhất là, nó thất bại StringIndexOutOfBoundsExceptionthay vì trả về một chuỗi rỗng nếu không có phần mở rộng.
Eric Duminil

Câu trả lời:


649

Trong trường hợp này, sử dụng FilenameUtils.getExtension từ Apache Commons IO

Dưới đây là một ví dụ về cách sử dụng nó (bạn có thể chỉ định đường dẫn đầy đủ hoặc chỉ tên tệp):

String ext1 = FilenameUtils.getExtension("/path/to/file/foo.txt"); // returns "txt"
String ext2 = FilenameUtils.getExtension("bar.exe"); // returns "exe"

Phụ thuộc Maven:

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.6</version>
</dependency>

Lớp Groovy DSL

implementation 'commons-io:commons-io:2.6'

Lớp DSLlin DSL

implementation("commons-io:commons-io:2.6")

Những người khác https://search.maven.org/artifact/commons-io/commons-io/2.6/jar


70
Cần lưu ý rằng nó chỉ trả về "gz" cho một tệp có tên archive.tar.gz.
Zitrax

106
@Zitrax đó là vì "gz" là phần mở rộng tập tin.
BrainSlugs83

6
@ BrainSlugs83 Vậy "tar" nghĩa là gì?
TuGordoBello

31
@zhelon .gz là viết tắt của tệp nén gnu và .tar là viết tắt của (t) ape (ar) chive. Vì vậy, .tar.gz là một tệp tar bên trong tệp nén gnu, có phần mở rộng .gz.
cirovladimir

5
Không có lý do để mang vào một thư viện khác cho nhiệm vụ đơn giản này.
masterwok

311

Bạn có thực sự cần một "trình phân tích cú pháp" cho việc này không?

String extension = "";

int i = fileName.lastIndexOf('.');
if (i > 0) {
    extension = fileName.substring(i+1);
}

Giả sử rằng bạn đang xử lý các tên tệp đơn giản giống như Windows, không phải như thế archive.tar.gz.

Btw, trong trường hợp thư mục có thể có '.', Nhưng tên tệp không có (như /path/to.a/file), bạn có thể làm

String extension = "";

int i = fileName.lastIndexOf('.');
int p = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));

if (i > p) {
    extension = fileName.substring(i+1);
}

4
Cảm ơn! Chắc chắn bạn có thể cần một trình phân tích cú pháp / đối tượng cho việc này, nếu bạn muốn thực hiện nhiều thao tác hơn chỉ là phần mở rộng ... hãy nói nếu bạn chỉ muốn đường dẫn, thư mục mẹ, tên tệp (trừ phần mở rộng), v.v. m đến từ C # và .Net nơi chúng tôi có cái này: msdn.microsoft.com/en-us/l
Library / từ

10
Như bạn nói, có một số điều cần suy nghĩ, ngoài việc sử dụng Last IndexOf ngây thơ ("."). Tôi đoán rằng Apache Commons có một phương pháp cho việc này, trong đó tính đến tất cả các vấn đề tiềm ẩn nhỏ khó hiểu.
MatrixFrog

12
Tôi nghĩ i > 0nên được thay đổi thành i >= 0hoặc i != -1. Điều này chăm sóc tên tập tin như thế nào .htaccess.
Pijusn

8
bất kể đoạn mã đơn giản đến mức nào ... bạn vẫn cần cập nhật / duy trì / kiểm tra nó / làm cho nó trở thành một phụ thuộc thuận tiện ... dễ dàng hơn nhiều nếu đã có một lib làm tất cả điều đó
Don Cheadle

2
Trên nhiều gotcha là nếu tập tin endds có dấu chấm. Tốt hơn trong một lib. if (i> p && i <(fileName.length () - 1)) {extension = fileName.sub chuỗi (i + 1);
tgkprog 6/07/2015

97
private String getFileExtension(File file) {
    String name = file.getName();
    int lastIndexOf = name.lastIndexOf(".");
    if (lastIndexOf == -1) {
        return ""; // empty extension
    }
    return name.substring(lastIndexOf);
}

13
Cần lưu ý rằng điều này trả về '.' đồng thời, vì vậy, phần mở rộng tệp của bạn sẽ là '.txt' trái ngược với 'txt' trong một số câu trả lời khác
NickEntin

2
Trả lời tốt hơn và @NickEntin Nhận xét tốt hơn. Để xóa dấu chấm "." từ phần mở rộng của tệp, có thể được mã hóa thành int lastIndexOf = name.lastIndexOf (".") + 1;
Hanzallah Afgan

11
Cách tiếp cận đó có thể không hoạt động trong một số trường hợp, ví dụ: /usr/bin/foo.bar/httpconf
Iman Akbari

8
@ lukasz1985 1. Hàng trăm gói linux tạo các thư mục có tên như "init.d", hơn nữa không an toàn khi dựa vào đường dẫn không có thư mục có dấu chấm, vì nó không bất hợp pháp 2. Tôi đã mã hóa cho Android nên tôi đã sử dụng một số SDK phương pháp tôi không nhớ nhưng tôi đoán stackoverflow.com/a/3571239/2546146 không có lỗi này
Iman Akbari

6
@Iman Akbari: getName () chỉ trả về tên tệp, đó sẽ là "httpconf" trong ví dụ của bạn.
Chủ tịch Dreamspace

85

Nếu bạn sử dụng thư viện Guava , bạn có thể dùng đến Fileslớp tiện ích. Nó có một phương pháp cụ thể getFileExtension(),. Ví dụ:

String path = "c:/path/to/file/foo.txt";
String ext = Files.getFileExtension(path);
System.out.println(ext); //prints txt

Ngoài ra, bạn cũng có thể có được tên tệp có chức năng tương tự, getNameWithoutExtension () :

String filename = Files.getNameWithoutExtension(path);
System.out.println(filename); //prints foo

4
Có thật không? Đó là một thư viện tuyệt vời, đầy đủ các tiện ích. Hầu hết trong số chúng sẽ là một phần của Java8, giống như Hàm ổi tuyệt vời .
JeanValjean

Không phải tất cả mọi người có thể quyết định sử dụng thư viện nào. Ít nhất chúng ta có Apache Commons, mặc dù là một cái cũ.
Lluis Martinez

1
Nếu bạn thấy mã nguồn getFileExtensionthực sự thì nó int dotIndex = fileName.lastIndexOf('.'); return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1)không phải là vấn đề lớn. Ngoài ra, lưu ý rằng Filesđược đánh dấu là "không ổn định" vì một số lý do.
Al-Mothafar

@ Al-Mothafar rất nhiều lớp được đánh dấu là không ổn định (xem các trình tạo đa chế độ), tôi cũng không hiểu tại sao: một số bản phát hành đã được tạo ra, nhưng không có gì thay đổi ở đó.
JeanValjean

27

Nếu trên Android, bạn có thể sử dụng điều này:

String ext = android.webkit.MimeTypeMap.getFileExtensionFromUrl(file.getName());

Lưu ý rằng điều này sẽ không hoạt động nếu chuỗi không được mã hóa (ví dụ: chứa một khoảng trắng hoặc ký tự tiếng Trung Quốc), xem: stackoverflow.com/a/14321470/1074998
Fruit

14

Để đưa vào tài khoản tên tệp không có ký tự trước dấu chấm, bạn phải sử dụng biến thể nhỏ của câu trả lời được chấp nhận:

String extension = "";

int i = fileName.lastIndexOf('.');
if (i >= 0) {
    extension = fileName.substring(i+1);
}

"file.doc" => "doc"
"file.doc.gz" => "gz"
".doc" => "doc"

có lẽ nên tự bảo vệ mình trước "foo." đầu vào.
chrisinmtown

14

Đây là một phương pháp đã được thử nghiệm

public static String getExtension(String fileName) {
    char ch;
    int len;
    if(fileName==null || 
            (len = fileName.length())==0 || 
            (ch = fileName.charAt(len-1))=='/' || ch=='\\' || //in the case of a directory
             ch=='.' ) //in the case of . or ..
        return "";
    int dotInd = fileName.lastIndexOf('.'),
        sepInd = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));
    if( dotInd<=sepInd )
        return "";
    else
        return fileName.substring(dotInd+1).toLowerCase();
}

Và trường hợp thử nghiệm:

@Test
public void testGetExtension() {
    assertEquals("", getExtension("C"));
    assertEquals("ext", getExtension("C.ext"));
    assertEquals("ext", getExtension("A/B/C.ext"));
    assertEquals("", getExtension("A/B/C.ext/"));
    assertEquals("", getExtension("A/B/C.ext/.."));
    assertEquals("bin", getExtension("A/B/C.bin"));
    assertEquals("hidden", getExtension(".hidden"));
    assertEquals("dsstore", getExtension("/user/home/.dsstore"));
    assertEquals("", getExtension(".strange."));
    assertEquals("3", getExtension("1.2.3"));
    assertEquals("exe", getExtension("C:\\Program Files (x86)\\java\\bin\\javaw.exe"));
}

10

Tôi bẩn và có thể tin tưởng nhất khi sử dụng String.replaceAll :

.replaceAll("^.*\\.(.*)$", "$1")

Lưu ý rằng đầu tiên *là tham lam vì vậy nó sẽ lấy hầu hết các ký tự có thể càng xa càng tốt và sau đó chỉ là dấu chấm cuối cùng và phần mở rộng tệp sẽ được để lại.


Điều này không thành công nếu tập tin không có phần mở rộng.
Zack

Tuy nhiên, thật không may, tuy nhiên vẫn có thể được sử dụng cho các tình huống đơn giản như phát hiện loại tệp nhanh và chẳng hạn như có một phần mở rộng không chính xác không khác gì với không có, hoặc người ta có thể đặt điều kiện if khi kết quả thay thế bằng đầu vào.
Ebrahim Byagowi

1
Hoặc thậm chí ngắn hơn.replaceAll(".*\\.", "")
Ebrahim Byagowi

10
String path = "/Users/test/test.txt";
String extension = "";

if (path.contains("."))
     extension = path.substring(path.lastIndexOf("."));

trả về ".txt"

nếu bạn chỉ muốn "txt", hãy thực hiện path.lastIndexOf(".") + 1


9

Rõ ràng từ tất cả các câu trả lời khác, không có chức năng "tích hợp" đầy đủ. Đây là một phương pháp an toàn và đơn giản.

String getFileExtension(File file) {
    if (file == null) {
        return "";
    }
    String name = file.getName();
    int i = name.lastIndexOf('.');
    String ext = i > 0 ? name.substring(i + 1) : "";
    return ext;
}

7

Còn về (sử dụng Java 1.5 RegEx):

    String[] split = fullFileName.split("\\.");
    String ext = split[split.length - 1];

6

Nếu bạn dự định sử dụng Apache commons-io và chỉ muốn kiểm tra phần mở rộng của tệp và sau đó thực hiện một số thao tác, bạn có thể sử dụng điều này , đây là đoạn trích:

if(FilenameUtils.isExtension(file.getName(),"java")) {
    someoperation();
}

Lưu ý rằng kiểm tra này là trường hợp nhạy cảm theo các tài liệu.
Babken Vardanyan

6

Đây là một lớp lót khác cho Java 8.

String ext = Arrays.stream(fileName.split("\\.")).reduce((a,b) -> b).orElse(null)

Nó hoạt động như sau:

  1. Chia chuỗi thành một chuỗi các chuỗi bằng cách sử dụng "."
  2. Chuyển đổi mảng thành một luồng
  3. Sử dụng less để lấy phần tử cuối cùng của luồng, tức là phần mở rộng tệp

4

Làm thế nào về JFileChooser? Nó không đơn giản vì bạn sẽ cần phân tích đầu ra cuối cùng của nó ...

JFileChooser filechooser = new JFileChooser();
File file = new File("your.txt");
System.out.println("the extension type:"+filechooser.getTypeDescription(file));

đó là loại MIME ...

OK ... Tôi quên rằng bạn không muốn biết loại MIME của nó.

Mã thú vị trong liên kết sau: http://doad.oracle.com/javase/tutorial/uiswing/components/filechooser.html

/*
 * Get the extension of a file.
 */  
public static String getExtension(File f) {
    String ext = null;
    String s = f.getName();
    int i = s.lastIndexOf('.');

    if (i > 0 &&  i < s.length() - 1) {
        ext = s.substring(i+1).toLowerCase();
    }
    return ext;
}

Câu hỏi liên quan: Làm cách nào để cắt bớt phần mở rộng tệp từ Chuỗi trong Java?


4

Đây là một phương thức xử lý .tar.gzđúng cách, ngay cả trong một đường dẫn có dấu chấm trong tên thư mục:

private static final String getExtension(final String filename) {
  if (filename == null) return null;
  final String afterLastSlash = filename.substring(filename.lastIndexOf('/') + 1);
  final int afterLastBackslash = afterLastSlash.lastIndexOf('\\') + 1;
  final int dotIndex = afterLastSlash.indexOf('.', afterLastBackslash);
  return (dotIndex == -1) ? "" : afterLastSlash.substring(dotIndex + 1);
}

afterLastSlashđược tạo để làm cho việc tìm kiếm afterLastBackslashnhanh hơn vì nó sẽ không phải tìm kiếm toàn bộ chuỗi nếu có một số dấu gạch chéo trong đó.

Bên char[]trong bản gốc Stringđược sử dụng lại, không thêm rác ở đó và JVM có thể sẽ nhận thấy đó afterLastSlashlà rác ngay lập tức để đặt nó vào ngăn xếp thay vì đống .


phương pháp này được sao chép từ mã nguồn Guava, bạn phải đề cập đến điều này.
nhục nhã

1
Tôi đã không sao chép điều này. Nếu nó nằm trong mã nguồn của ổi, họ đã sao chép nó từ đây. Có lẽ thông báo cho họ.
Oledit

xin lỗi vì nó không giống hệt btw, vì vậy có thể bạn và nhà phát triển Guava chỉ có cùng một ý tưởng.
nhục nhã

2
Thực sự "gz" là phần mở rộng chính xác để trở lại. Nếu mã cuộc gọi cũng có thể xử lý "tar" thì nó cũng nên kiểm tra, bên ngoài một getExtensionchức năng. Nếu tên tệp của người dùng là "my zip. don't touch.tar.gz"phương thức này sẽ trả về phần mở rộng sai.
intrepidis

2
// Modified from EboMike's answer

String extension = "/path/to/file/foo.txt".substring("/path/to/file/foo.txt".lastIndexOf('.'));

tiện ích mở rộng nên có ".txt" trong đó khi chạy.


13
Sẽ sụp đổ nếu tên không có phần mở rộng.
EboMike

2

Đây là phiên bản có Tùy chọn là giá trị trả về (vì bạn không thể chắc chắn tệp có phần mở rộng) ... cũng kiểm tra độ tỉnh táo ...

import java.io.File;
import java.util.Optional;

public class GetFileExtensionTool {

    public static Optional<String> getFileExtension(File file) {
        if (file == null) {
            throw new NullPointerException("file argument was null");
        }
        if (!file.isFile()) {
            throw new IllegalArgumentException("getFileExtension(File file)"
                    + " called on File object that wasn't an actual file"
                    + " (perhaps a directory or device?). file had path: "
                    + file.getAbsolutePath());
        }
        String fileName = file.getName();
        int i = fileName.lastIndexOf('.');
        if (i > 0) {
            return Optional.of(fileName.substring(i + 1));
        } else {
            return Optional.empty();
        }
    }
}

2

Làm thế nào về phiên bản REGEX :

static final Pattern PATTERN = Pattern.compile("(.*)\\.(.*)");

Matcher m = PATTERN.matcher(path);
if (m.find()) {
    System.out.println("File path/name: " + m.group(1));
    System.out.println("Extention: " + m.group(2));
}

hoặc với phần mở rộng null được hỗ trợ:

static final Pattern PATTERN =
    Pattern.compile("((.*\\" + File.separator + ")?(.*)(\\.(.*)))|(.*\\" + File.separator + ")?(.*)");

class Separated {
    String path, name, ext;
}

Separated parsePath(String path) {
    Separated res = new Separated();
    Matcher m = PATTERN.matcher(path);
    if (m.find()) {
        if (m.group(1) != null) {
            res.path = m.group(2);
            res.name = m.group(3);
            res.ext = m.group(5);
        } else {
            res.path = m.group(6);
            res.name = m.group(7);
        }
    }
    return res;
}


Separated sp = parsePath("/root/docs/readme.txt");
System.out.println("path: " + sp.path);
System.out.println("name: " + sp.name);
System.out.println("Extention: " + sp.ext);

kết quả cho * nix:
path: / root / docs /
name: readme
Gia hạn: txt

đối với windows, parsePath ("c: \ windows \ readme.txt"):
path: c: \ windows \
name: readme
Gia hạn: txt


1
String extension = com.google.common.io.Files.getFileExtension("fileName.jpg");

1

Ở đây tôi đã thực hiện một phương thức nhỏ (tuy nhiên không an toàn và không kiểm tra nhiều lỗi), nhưng nếu chỉ có bạn đang lập trình một chương trình java chung, thì điều này là quá đủ để tìm ra kiểu tệp. Điều này không làm việc cho các kiểu tệp phức tạp, nhưng chúng thường không được sử dụng nhiều.

    public static String getFileType(String path){
       String fileType = null;
       fileType = path.substring(path.indexOf('.',path.lastIndexOf('/'))+1).toUpperCase();
       return fileType;
}

OP đang tìm kiếm phương thức tích hợp
Panther

(1) Bạn nên sử dụng lastIndexOfđể tên tệp như john.smith.report.docđược xử lý đúng. (2) Bạn nên xử lý đúng các trường hợp khi không có phần mở rộng. Phương thức này trả về ABC/XYZcho một đường dẫn như thế abc/xyz, không có ý nghĩa gì. Nó sẽ có ý nghĩa hơn để trở lại ""hoặc null. (3) Dấu phân cách tệp không phải lúc nào cũng /.
Radiodef

1

Nhận phần mở rộng tệp từ tên tệp

/**
 * The extension separator character.
 */
private static final char EXTENSION_SEPARATOR = '.';

/**
 * The Unix separator character.
 */
private static final char UNIX_SEPARATOR = '/';

/**
 * The Windows separator character.
 */
private static final char WINDOWS_SEPARATOR = '\\';

/**
 * The system separator character.
 */
private static final char SYSTEM_SEPARATOR = File.separatorChar;

/**
 * Gets the extension of a filename.
 * <p>
 * This method returns the textual part of the filename after the last dot.
 * There must be no directory separator after the dot.
 * <pre>
 * foo.txt      --> "txt"
 * a/b/c.jpg    --> "jpg"
 * a/b.txt/c    --> ""
 * a/b/c        --> ""
 * </pre>
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename the filename to retrieve the extension of.
 * @return the extension of the file or an empty string if none exists.
 */
public static String getExtension(String filename) {
    if (filename == null) {
        return null;
    }
    int index = indexOfExtension(filename);
    if (index == -1) {
        return "";
    } else {
        return filename.substring(index + 1);
    }
}

/**
 * Returns the index of the last extension separator character, which is a dot.
 * <p>
 * This method also checks that there is no directory separator after the last dot.
 * To do this it uses {@link #indexOfLastSeparator(String)} which will
 * handle a file in either Unix or Windows format.
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename  the filename to find the last path separator in, null returns -1
 * @return the index of the last separator character, or -1 if there
 * is no such character
 */
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);
}

/**
 * Returns the index of the last directory separator character.
 * <p>
 * This method will handle a file in either Unix or Windows format.
 * The position of the last forward or backslash is returned.
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename  the filename to find the last path separator in, null returns -1
 * @return the index of the last separator character, or -1 if there
 * is no such character
 */
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);
}

Tín dụng

  1. Sao chép từ Lớp FileNameUtils của Apache - http://grepcode.com/file/repo1.maven.org/maven2/commons-io/commons-io/1.3.2/org/apache/commons/io/FilenameUtils.java#FilenameUtils. getExtension% 28java.lang.String% 29

1

Không sử dụng bất kỳ thư viện nào, bạn có thể sử dụng phân tách phương thức String như sau:

        String[] splits = fileNames.get(i).split("\\.");

        String extension = "";

        if(splits.length >= 2)
        {
            extension = splits[splits.length-1];
        }

0

Chỉ là một thay thế dựa trên biểu thức thông thường. Không nhanh, không tốt.

Pattern pattern = Pattern.compile("\\.([^.]*)$");
Matcher matcher = pattern.matcher(fileName);

if (matcher.find()) {
    String ext = matcher.group(1);
}

0

Tôi tìm thấy một cách tốt hơn để tìm phần mở rộng bằng cách trộn tất cả các câu trả lời ở trên

public static String getFileExtension(String fileLink) {

        String extension;
        Uri uri = Uri.parse(fileLink);
        String scheme = uri.getScheme();
        if (scheme != null && scheme.equals(ContentResolver.SCHEME_CONTENT)) {
            MimeTypeMap mime = MimeTypeMap.getSingleton();
            extension = mime.getExtensionFromMimeType(CoreApp.getInstance().getContentResolver().getType(uri));
        } else {
            extension = MimeTypeMap.getFileExtensionFromUrl(fileLink);
        }

        return extension;
    }

public static String getMimeType(String fileLink) {
        String type = CoreApp.getInstance().getContentResolver().getType(Uri.parse(fileLink));
        if (!TextUtils.isEmpty(type)) return type;
        MimeTypeMap mime = MimeTypeMap.getSingleton();
        return mime.getMimeTypeFromExtension(FileChooserUtil.getFileExtension(fileLink));
    }

0

Tôi thích sự đơn giản của câu trả lời của quang phổ và được liên kết trong một trong những bình luận của anh ấy là một liên kết đến một câu trả lời khác sửa các dấu chấm trong đường dẫn tệp, trong một câu hỏi khác, do EboMike thực hiện .

Không triển khai một số loại API của bên thứ ba, tôi đề nghị:

private String getFileExtension(File file) {

    String name = file.getName().substring(Math.max(file.getName().lastIndexOf('/'),
            file.getName().lastIndexOf('\\')) < 0 ? 0 : Math.max(file.getName().lastIndexOf('/'),
            file.getName().lastIndexOf('\\')));
    int lastIndexOf = name.lastIndexOf(".");
    if (lastIndexOf == -1) {
        return ""; // empty extension
    }
    return name.substring(lastIndexOf + 1); // doesn't return "." with extension
}

Một cái gì đó như thế này có thể hữu ích trong bất kỳ writephương thức nào của ImageIO , nơi định dạng tệp phải được truyền vào.

Tại sao nên sử dụng toàn bộ API của bên thứ ba khi bạn có thể DIY?


0

Câu hỏi đặc biệt này đã cho tôi rất nhiều rắc rối sau đó tôi đã tìm thấy một giải pháp rất đơn giản cho vấn đề này mà tôi đang đăng ở đây.

file.getName().toLowerCase().endsWith(".txt");

Đó là nó.


3
OP cần một cách để trích xuất phần mở rộng - không phải kiểm tra một phần.
Manojlovic

thực sự là bất cứ điều gì bạn đang phát triển trong hầu hết các trường hợp bạn chỉ cần xử lý một loại tệp cụ thể..như vậy nếu vấn đề của bạn xảy ra trong lĩnh vực này thì điều này sẽ giúp bạn.
Vikram Bhardwaj

4
Điều đó không giải quyết được yêu cầu của anh ấy
Predrag Manojlovic

2
Đây không phải là một câu trả lời cho câu hỏi, nhưng đây thực sự là những gì tôi đang tìm kiếm.
Ediolot

-1

thử cái này.

String[] extension = "adadad.adad.adnandad.jpg".split("\\.(?=[^\\.]+$)"); // ['adadad.adad.adnandad','jpg']
extension[1] // jpg

-1
  @Test
    public void getFileExtension(String fileName){
      String extension = null;
      List<String> list = new ArrayList<>();
      do{
          extension =  FilenameUtils.getExtension(fileName);
          if(extension==null){
              break;
          }
          if(!extension.isEmpty()){
              list.add("."+extension);
          }
          fileName = FilenameUtils.getBaseName(fileName);
      }while (!extension.isEmpty());
      Collections.reverse(list);
      System.out.println(list.toString());
    }

-4

Java có một cách tích hợp để xử lý vấn đề này, trong lớp java.nio.file.Files , có thể hoạt động cho nhu cầu của bạn:

File f = new File("/path/to/file/foo.txt");
String ext = Files.probeContentType(f.toPath());
if(ext.equalsIgnoreCase("txt")) do whatever;

Lưu ý rằng phương pháp tĩnh này sử dụng các thông số kỹ thuật được tìm thấy ở đây để truy xuất "loại nội dung", có thể thay đổi.


28
Điều này là không chính xác. Kiểu trả về cho thăm dòContentType là loại nội dung Mime, không phải phần mở rộng tệp. Nó thường sẽ không phù hợp với phần mở rộng. Điều này cũng sẽ khá chậm trong trình duyệt tệp, vì nó thực sự mở tệp để xác định loại.
Charles
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.