如何在Java中获得没有扩展名的文件名?

有人能告诉我如何获得没有扩展名的文件名吗? 例子:< / p >
fileNameWithExt = "test.xml";
fileNameWithOutExt = "test";
364363 次浏览

请看下面的测试程序:

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."));
}
}

输出:

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

最简单的方法是使用正则表达式。

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

上面的表达式将删除最后一个点后面跟一个或多个字符。这是一个基本的单元测试。

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

如果你像我一样,更愿意使用一些库代码,他们可能已经考虑了所有特殊情况,比如如果你在路径中传递或点,但不在文件名中传递,会发生什么,你可以使用以下方法:

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

虽然我是重用库的忠实信徒,但org.apache.commons.io JAR是174KB,这对于一个移动应用程序来说非常大。

如果您下载源代码并查看它们的FilenameUtils类,您可以看到有许多额外的实用程序,并且它确实可以处理Windows和Unix路径,这些都很可爱。

然而,如果你只是想要几个静态实用程序方法用于Unix风格的路径(带“/”分隔符),你可能会发现下面的代码很有用。

removeExtension方法保留路径的其余部分和文件名。还有一个类似的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;
}

试试下面的代码。使用核心Java基本函数。它负责有扩展名的__abc0和没有扩展名的__abc0(没有'.'字符)。还介绍了多个'.'的情况。

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字符串。

如果你的项目使用番石榴(14.0或更新版本),你可以使用Files.getNameWithoutExtension()

(本质上与Apache Commons IO中的FilenameUtils.removeExtension()相同,如好像是回答所示。只是想指出番石榴也会这样。就我个人而言,我不想在commons中添加依赖项——我觉得这有点过时了——就是因为这个原因。)

这是根据我的喜好排列的综合清单。

使用apache commons

import org.apache.commons.io.FilenameUtils;


String fileNameWithoutExt = FilenameUtils.getBaseName(fileName);
                          

OR


String fileNameWithOutExt = FilenameUtils.removeExtension(fileName);

使用谷歌番石榴(如果你已经在使用)

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

Files.getNameWithoutExtension . getnamewithoutextension .

或者使用Core Java

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);
}
if (fileName.indexOf(".") > 0) {
return fileName.substring(0, fileName.lastIndexOf("."));
} else {
return fileName;
}
private static final Pattern ext = Pattern.compile("(?<=.)\\.[^.]+$");


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

Liferay API

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

下面是来自https://android.googlesource.com/platform/tools/tradefederation/+/master/src/com/android/tradefed/util/FileUtil.java的引用

/**
* 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,我提取了相同的功能:

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

你可以用“。”来分割它,在索引0上是文件名,在索引1上是扩展名,但是我倾向于使用apache.commons-io中的FileNameUtils,就像在第一篇文章中提到的那样。它不需要被移除,但足够:

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

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

使用Apache Commons IO中的FilenameUtils.removeExtension

例子:

你可以提供全路径名只有文件名

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

希望这能有所帮助。

流利的方式:

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

从相对路径或完整路径获取名称的最简单方法是使用

< p > <代码>进口org.apache.commons.io.FilenameUtils; FilenameUtils.getBaseName (definitionFilePath) < /代码> < / p >

简单起见,使用Java的String.replaceAll()方法,如下所示:

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

当filenamewitheext包含完全限定路径时,这也可以工作。

你可以使用java split函数从扩展名中分离文件名,如果你确定文件名中只有一个用于扩展名的点。

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

所以split[0]将返回"test"而split[1]将返回"txt"

我的解决方案需要以下导入。

import java.io.File;

下面的方法应该返回所需的输出字符串:

private static String getFilenameWithoutExtension(File file) throws IOException {
String filename = file.getCanonicalPath();
String filenameWithoutExtension;
if (filename.contains("."))
filenameWithoutExtension = filename.substring(filename.lastIndexOf(System.getProperty("file.separator"))+1, filename.lastIndexOf('.'));
else
filenameWithoutExtension = filename.substring(filename.lastIndexOf(System.getProperty("file.separator"))+1);


return filenameWithoutExtension;
}

对于Kotlin来说,它现在很简单:

val fileNameStr = file.nameWithoutExtension
fileEntry.getName().substring(0, fileEntry.getName().lastIndexOf("."));

com.google.common.io.Files

Files.getNameWithoutExtension (sourceFile.getName ())

能胜任一份工作吗

给定字符串filename,你可以这样做:

String filename = "test.xml";
filename.substring(0, filename.lastIndexOf("."));   // Output: test
filename.split("\\.")[0];   // Output: test