Java'da uzantı olmadan dosya adı nasıl alınır?


Yanıtlar:


429

Benim gibi, muhtemelen tüm özel durumları düşündükleri bir kütüphane kodu kullanmayı tercih edersiniz, örneğin yoldaki boş veya noktalardan geçerseniz, ancak dosya adında değilseniz ne olur?

import org.apache.commons.io.FilenameUtils;
String fileNameWithOutExt = FilenameUtils.removeExtension(fileNameWithExt);

61
doğrudan yol dizesinden uzantısız bir dosya adına gitmek için FilenameUtils.getBasename komutunu da kullanabilirsiniz.
Ian Durkan

2
En kolayı elbette maven çalıştırmak :-) Aksi takdirde bkz: commons.apache.org/io
Ulf Lindback

8
Guava'yı tercih edenler için bunu da yapabilir . (Bu günlerde kişisel olarak Apache Commons bağımlılıklarını ekleme konusunda kendimi çok iyi hissetmiyorum, ancak tarihsel olarak bu kütüphaneler çok faydalı oldu.)
Jonik

3
Guava ve Commons-IO biraz fazladan teklif sunsa da , JDK 7'ye kaç tane kolaylık yönteminin dahil olduğunu java.nio.file.Filesve Pathtemel dizinleri çözme, tek satırlık kopyalama / taşıma, yalnızca dosya adını alma gibi sürprizlere şaşıracaksınız. vs
Don Cheadle

3
@Lan Durkan Su anda N ile FilenameUtils.getBaseName
Yavaş Harry

153

En kolay yol, düzenli bir ifade kullanmaktır.

fileNameWithOutExt = "test.xml".replaceFirst("[.][^.]+$", "");

Yukarıdaki ifade son noktayı ve ardından bir veya daha fazla karakteri kaldıracaktır. İşte temel bir birim testi.

public void testRegex() {
    assertEquals("test", "test.xml".replaceFirst("[.][^.]+$", ""));
    assertEquals("test.2", "test.2.xml".replaceFirst("[.][^.]+$", ""));
}

11
Regex'in yukarıdaki kütüphane çözümü kadar kullanımı kolay değildir. Çalışıyor, ancak koda bakmak (REGEX'i yorumlamak zorunda kalmadan) ne yaptığı belli değil.
Gustavo Litovsky

5
@GustavoLitovsky Android ile birlikte gelmiyor org.apache.commons. Bildiğim kadarıyla, bunu Android'de yapmanın tek yolu bu.
Liam George Betsworth

1
/ * aşağıdaki normal ifade ayrıca * / "/the/path/name.extension".replaceAll(".*[\\\\/mıyor|\\.[^\\. Cialis*$", "" yolunu da kaldırır) ;
daggett

1
Sana "/foo/bar.x/baz" gibi bir yol ile takıldı değiliz sağlamak için ikinci karakter sınıfına eğik çizgi eklersiniz
chrisinmtown

53

Aşağıdaki test programına bakın:

public class javatemp {
    static String stripExtension (String str) {
        // Handle null case specially.

        if (str == null) return null;

        // Get position of last '.'.

        int pos = str.lastIndexOf(".");

        // If there wasn't any '.' just return the string as is.

        if (pos == -1) return str;

        // Otherwise return the string, up to the dot.

        return str.substring(0, pos);
    }

    public static void main(String[] args) {
        System.out.println ("test.xml   -> " + stripExtension ("test.xml"));
        System.out.println ("test.2.xml -> " + stripExtension ("test.2.xml"));
        System.out.println ("test       -> " + stripExtension ("test"));
        System.out.println ("test.      -> " + stripExtension ("test."));
    }
}

hangi çıktılar:

test.xml   -> test
test.2.xml -> test.2
test       -> test
test.      -> test

Uzantısı nedir foo.tar.gz? Neden .tar.gzistediğin şey olduğunu anlayabiliyorum.
tchrist

5
@tchrist, foo.tar.gzgzip edilmiş bir versiyonudur, foo.tarbu yüzden gzuzantı olduğunu iddia edebilirsiniz . Her şey , uzantıyı nasıl tanımladığınıza bağlıdır.
paxdiablo

2
gibi dosyalar ile ne yapmalı .gitignore?
michael nesterenko

bildiğiniz gibi java sınıf adı asla küçük harf ile başlamalıdır!
AnujKu

7
Bu bir kural olsaydı, dil onu uygulardı. Olmadığı için bu bir rehberdir ancak şiddetle tavsiye edilir. Her durumda, bu soru ve cevap ile tamamen ilgisizdir.
paxdiablo

47

İşte benim tercihime göre konsolide liste sırası.

Apache ortaklarını kullanma

import org.apache.commons.io.FilenameUtils;

String fileNameWithoutExt = FilenameUtils.getBaseName(fileName);

                           OR

String fileNameWithOutExt = FilenameUtils.removeExtension(fileName);

Google Guava'yı kullanma (Zaten kullanıyorsanız)

import com.google.common.io.Files;
String fileNameWithOutExt = Files.getNameWithoutExtension(fileName);

Veya Core Java kullanarak

1)

String fileName = file.getName();
int pos = fileName.lastIndexOf(".");
if (pos > 0 && pos < (fileName.length() - 1)) { // If '.' is not the first or last character.
    fileName = fileName.substring(0, pos);
}

2)

if (fileName.indexOf(".") > 0) {
   return fileName.substring(0, fileName.lastIndexOf("."));
} else {
   return fileName;
}

3)

private static final Pattern ext = Pattern.compile("(?<=.)\\.[^.]+$");

public static String getFileNameWithoutExtension(File file) {
    return ext.matcher(file.getName()).replaceAll("");
}

Liferay API'sı

import com.liferay.portal.kernel.util.FileUtil; 
String fileName = FileUtil.stripExtension(file.getName());

42

Projeniz Guava (14.0 veya daha yeni) kullanıyorsa, devam edebilirsiniz Files.getNameWithoutExtension().

(Esasen FilenameUtils.removeExtension()Apache Commons IO'nunkiyle aynı, en yüksek oyu alan cevabın da belirttiği gibi. Guava'nın da bunu yaptığını belirtmek istedim. Şahsen Commons'a bağımlılık eklemek istemedim - ki bu biraz bir kalıntı. sadece bundan dolayı.)


2
aslında daha çokFilenameUtils.getBaseName()
Angelo.Hannes

aslında guava öyle dengesiz bir lib ki ben her yerde onu kullanmaktan kaçınırım. googel'in deneylerinden daha istikrarlı bir kalıntıyı tercih et
Slava

8

Aşağıda https://android.googlesource.com/platform/tools/tradefederation/+/master/src/com/android/tradefed/util/FileUtil.java referansı

/**
 * Gets the base name, without extension, of given file name.
 * <p/>
 * e.g. getBaseName("file.txt") will return "file"
 *
 * @param fileName
 * @return the base name
 */
public static String getBaseName(String fileName) {
    int index = fileName.lastIndexOf('.');
    if (index == -1) {
        return fileName;
    } else {
        return fileName.substring(0, index);
    }
}

1
Güzel bilgi, ancak kullanıcılar, bu yöntemin "" döndüreceği ".htaccess" gibi durumlar için farkında olun.
Markus Schulte

6

Apache.commons'un tamamını içe aktarmak istemiyorsanız, aynı işlevi çıkardım:

public class StringUtils {
    public static String getBaseName(String filename) {
        return removeExtension(getName(filename));
    }

    public static int indexOfLastSeparator(String filename) {
        if(filename == null) {
            return -1;
        } else {
            int lastUnixPos = filename.lastIndexOf(47);
            int lastWindowsPos = filename.lastIndexOf(92);
            return Math.max(lastUnixPos, lastWindowsPos);
        }
    }

    public static String getName(String filename) {
        if(filename == null) {
            return null;
        } else {
            int index = indexOfLastSeparator(filename);
            return filename.substring(index + 1);
        }
    }

    public static String removeExtension(String filename) {
        if(filename == null) {
            return null;
        } else {
            int index = indexOfExtension(filename);
            return index == -1?filename:filename.substring(0, index);
        }
    }

    public static int indexOfExtension(String filename) {
        if(filename == null) {
            return -1;
        } else {
            int extensionPos = filename.lastIndexOf(46);
            int lastSeparator = indexOfLastSeparator(filename);
            return lastSeparator > extensionPos?-1:extensionPos;
        }
    }
}

4

Ben kütüphaneleri yeniden kullanmak büyük bir inanan olsa da, org.apache.commons.io JAR 174KB, bir mobil uygulama için fark edilir derecede büyük.

Kaynak kodunu indirir ve FilenameUtils sınıfına bakarsanız, çok fazla yardımcı program olduğunu görebilirsiniz ve Windows ve Unix yollarıyla başa çıkabilir, hepsi güzel.

Bununla birlikte, Unix stil yollarıyla ("/" ayırıcıyla) kullanmak için birkaç statik yardımcı yöntem istiyorsanız, aşağıdaki kodu yararlı bulabilirsiniz.

removeExtensionYöntem, dosya adı ile birlikte yolun geri kalanı korur. Bir de benzer getExtension.

/**
 * Remove the file extension from a filename, that may include a path.
 * 
 * e.g. /path/to/myfile.jpg -> /path/to/myfile 
 */
public static String removeExtension(String filename) {
    if (filename == null) {
        return null;
    }

    int index = indexOfExtension(filename);

    if (index == -1) {
        return filename;
    } else {
        return filename.substring(0, index);
    }
}

/**
 * Return the file extension from a filename, including the "."
 * 
 * e.g. /path/to/myfile.jpg -> .jpg
 */
public static String getExtension(String filename) {
    if (filename == null) {
        return null;
    }

    int index = indexOfExtension(filename);

    if (index == -1) {
        return filename;
    } else {
        return filename.substring(index);
    }
}

private static final char EXTENSION_SEPARATOR = '.';
private static final char DIRECTORY_SEPARATOR = '/';

public static int indexOfExtension(String filename) {

    if (filename == null) {
        return -1;
    }

    // Check that no directory separator appears after the 
    // EXTENSION_SEPARATOR
    int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);

    int lastDirSeparator = filename.lastIndexOf(DIRECTORY_SEPARATOR);

    if (lastDirSeparator > extensionPos) {
        LogIt.w(FileSystemUtil.class, "A directory separator appears after the file extension, assuming there is no file extension");
        return -1;
    }

    return extensionPos;
}

1
public static String getFileExtension(String fileName) {
        if (TextUtils.isEmpty(fileName) || !fileName.contains(".") || fileName.endsWith(".")) return null;
        return fileName.substring(fileName.lastIndexOf(".") + 1);
    }

    public static String getBaseFileName(String fileName) {
        if (TextUtils.isEmpty(fileName) || !fileName.contains(".") || fileName.endsWith(".")) return null;
        return fileName.substring(0,fileName.lastIndexOf("."));
    }

1

Göreli yoldan veya tam yoldan ad almanın en basit yolu

import org.apache.commons.io.FilenameUtils; FilenameUtils.getBaseName(definitionFilePath)


0

"" İle bölebilirsiniz. ve dizin 0 dosya adı ve 1 uzantısıdır, ancak ilk makalede bahsedildiği gibi apache.commons-io FileNameUtils ile en iyi çözüm için eğim. Kaldırılması gerekmez, ancak yeterli olan:

String fileName = FilenameUtils.getBaseName("test.xml");


0

Kullanım FilenameUtils.removeExtensiongelen Apache Commons IO

Misal:

Tam yol adı veya yalnızca dosya adı sağlayabilirsiniz .

String myString1 = FilenameUtils.removeExtension("helloworld.exe"); // returns "helloworld"
String myString2 = FilenameUtils.removeExtension("/home/abc/yey.xls"); // returns "yey"

Bu yardımcı olur umarım ..


Bu zaten kabul edilen cevapta, bu yazının anlamı nedir?
Tom

0

Akıcı yol:

public static String fileNameWithOutExt (String fileName) {
    return Optional.of(fileName.lastIndexOf(".")).filter(i-> i >= 0)
            .map(i-> fileName.substring(0, i)).orElse(fileName);
}

0

Basit tutmak için Java'nın String.replaceAll () yöntemini aşağıdaki gibi kullanın:

String fileNameWithExt = "test.xml";
String fileNameWithoutExt
   = fileNameWithExt.replaceAll( "^.*?(([^/\\\\\\.]+))\\.[^\\.]+$", "$1" );

Bu, fileNameWithExt tam yolu içerdiğinde de çalışır.


0

Dosya adında uzantı için yalnızca bir nokta olduğundan eminseniz, dosya adını uzantıdan ayırmak için java split işlevini kullanabilirsiniz.

File filename = new File('test.txt'); File.getName().split("[.]");

böylece split[0]"test" ve split [1] "txt" döndürecektir


-3

Aşağıdaki kodu deneyin. Temel Java temel işlevlerini kullanma. Uzatmalı Stringve uzamasız ( '.'karaktersiz) s ile ilgilenir . Çoklu '.'durum da kapsanmaktadır.

String str = "filename.xml";
if (!str.contains(".")) 
    System.out.println("File Name=" + str); 
else {
    str = str.substring(0, str.lastIndexOf("."));
    // Because extension is always after the last '.'
    System.out.println("File Name=" + str);
}

nullDizelerle çalışmak için uyarlayabilirsiniz .


1
Bu tür işlevleri kendiniz uygulamak oldukça kötü bir uygulamadır. İlk bakışta görev son derece açık gibi görünüyor , ancak pratikte birçok istisnai durumla karşılaşacaksınız ( .dosya adında hiç yok veya dosya bir yedek ve adı document.docx.backupvb. Gibi). Sizin için tüm bu istisnai durumlarla ilgilenen harici kütüphane kullanmak çok daha güvenilirdir.
ivstas

1
Öte yandan, projenize birçok kütüphaneye eklemek onu büyütecektir. Bunun gibi basit şeyler kendiniz yapılabilir.
Nicolas Tyler

1
Bunu kendin yapmanýn bir yolu yok. Bu zor: ancak uzantısı olmayan dosyalar. yol, ftp yolları, pencereler ve unix eğik çizgiler, sembolik bağlantılar vb ... Kesinlikle başarısız olacak ve biraz bellek kazanmaya çalışarak dengesizlik çok reklam olacak. Lisanslar izin veriyorsa, en azından kurulu kodun kaynaklarını kopyalayın.
Jonathan Nappee

Bu kod, Amit Mishra'nınkine benziyor, ancak 'if (! Str.contains ("."))'
Broken_Window 13:16

"/someFolder/some.other.folder/someFileWithoutExtention" durumunda başarısız olur. 2 saniye sonra akla ilk gelen şey .. eminim diğer örnekler bir ton yük gelebilir.
Newtopian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.