Yanıtlar:
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);
java.nio.file.Files
ve Path
temel dizinleri çözme, tek satırlık kopyalama / taşıma, yalnızca dosya adını alma gibi sürprizlere şaşıracaksınız. vs
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("[.][^.]+$", ""));
}
org.apache.commons
. Bildiğim kadarıyla, bunu Android'de yapmanın tek yolu bu.
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
foo.tar.gz
? Neden .tar.gz
istediğin şey olduğunu anlayabiliyorum.
foo.tar.gz
gzip edilmiş bir versiyonudur, foo.tar
bu yüzden gz
uzantı olduğunu iddia edebilirsiniz . Her şey , uzantıyı nasıl tanımladığınıza bağlıdır.
.gitignore
?
İş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());
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ı.)
FilenameUtils.getBaseName()
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);
}
}
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;
}
}
}
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.
removeExtension
Yö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;
}
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("."));
}
Göreli yoldan veya tam yoldan ad almanın en basit yolu
import org.apache.commons.io.FilenameUtils;
FilenameUtils.getBaseName(definitionFilePath)
Kullanım FilenameUtils.removeExtension
gelen 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 ..
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);
}
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
Aşağıdaki kodu deneyin. Temel Java temel işlevlerini kullanma. Uzatmalı String
ve 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);
}
null
Dizelerle çalışmak için uyarlayabilirsiniz .
.
dosya adında hiç yok veya dosya bir yedek ve adı document.docx.backup
vb. Gibi). Sizin için tüm bu istisnai durumlarla ilgilenen harici kütüphane kullanmak çok daha güvenilirdir.