我有一个文件名和扩展名列表。我想检查文件名是否以我所拥有的列表中的任何扩展名结尾。
String fileName = "abc.txt";
String[] extensions = {".txt", ".doc", ".pdf"};
我可以手动检查扩展列表,检查文件是否以列表中的任何扩展名结尾。
public static boolean checkIfFileHasExtension(String s, String[] extn) {
for (String entry : extn) {
if (s.endsWith(entry)) {
return true;
}
}
return false;
}
public static void main (String[] args) throws java.lang.Exception
{
// your code goes here
String fileName = "abc.txt";
String[] extensions = {".txt", ".doc", ".pdf"};
System.out.println(checkIfFileHasExtension(fileName, extensions));
}
使用StringUtils或Streams或任何其他Java库有更好的方法吗?我正在寻找一个单线。谢谢!
答案 0 :(得分:9)
试试这个。
public static boolean checkIfFileHasExtension(String s, String[] extn) {
return Arrays.stream(extn).anyMatch(entry -> s.endsWith(entry));
}
答案 1 :(得分:3)
如果使用contains(String)
而不是数组,则可以使用lastIndexOf()
方法。
此外,您可以使用。检索扩展名
String
的{{1}}方法与subString()
方法相结合。
List<String> extensions = Arrays.asList(".txt", ".doc", ".pdf");
boolean isContained = extensions.contains(fileName.subString(fileName.lastIndexOf(".")+1));
答案 2 :(得分:0)
另一种方法是使用.
作为分隔符进行标记化
String fileName = "abc.txt";
List<String> extensions = Arrays.asList("txt", "doc", "pdf");
boolean checkExt(String fileName, List<String> extensions)
{
String s = fileName.split(".");
return extensions.contains(s[s.length-1]);
}
答案 3 :(得分:0)
Apache Commons Lang StringUtils.endsWithAny与您的方法完全相同。您可以像这样使用它:
public static void main (String[] args) {
String fileName = "abc.txt";
String[] extensions = {".txt", ".doc", ".pdf"};
System.out.println(org.apache.commons.lang3.StringUtils.endsWithAny(fileName, extensions));
}
但是如前所述,它的性能与extensions
呈线性关系,因此,如果您有很多,则尝试从文件名中提取扩展名并针对HashSet
进行查找:
String fileName = "abc.txt";
String[] extensions = {"txt", "doc", "pdf"};
HashSet<String> extensionsSet = new HashSet<>(Arrays.asList(extensions));
String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1);
System.out.println(extensionsSet.contains(fileExt));
注意:HashSet
使用更多的内存,因此它比按数组进行线性搜索要慢。如果您将其作为常数使用,则可以,但如果动态使用,则可以衡量您的性能。
如果您可以将前缀用作字符串,则可以尝试使用预编译的正则表达式:它可能会更快地工作。
答案 4 :(得分:-2)
<强>更新强>
来自javadoc -
public static int indexOfAny(CharSequence str,
CharSequence... searchStrs)
Find the first index of any of a set of potential substrings.
A null CharSequence will return -1. A null or zero length search array will return -1. A null search array entry will be ignored, but a search array containing "" will return 0 if str is not null. This method uses String.indexOf(String) if possible.
StringUtils.indexOfAny(null, *) = -1
StringUtils.indexOfAny(*, null) = -1
StringUtils.indexOfAny(*, []) = -1
StringUtils.indexOfAny("zzabyycdxx", ["ab","cd"]) = 2
StringUtils.indexOfAny("zzabyycdxx", ["cd","ab"]) = 2
StringUtils.indexOfAny("zzabyycdxx", ["mn","op"]) = -1
StringUtils.indexOfAny("zzabyycdxx", ["zab","aby"]) = 1
StringUtils.indexOfAny("zzabyycdxx", [""]) = 0
StringUtils.indexOfAny("", [""]) = 0
StringUtils.indexOfAny("", ["a"]) = -1