我有这个实现FilenameFilter
package Logic;
import java.io.File;
import java.io.FilenameFilter;
public class Filter implements FilenameFilter {
String name;
public Filter(String name) {
this.name = name;
}
@Override
public boolean accept(File dir, String filename) {
return name.contains("bluetooth");
}
}
我在这个方法中使用这个类:
public String searchForBluetoothFolder() {
String folderNameToSearchFor = "bluetooth";
File root = sdCard;
FilenameFilter filter = new Filter(folderNameToSearchFor);
String[] bluetoothFolder = root.list(filter);
for(int i = 0; i < bluetoothFolder.length; i++) {
Log.i("Bluetooth: ", bluetoothFolder[i]);
}
return "";
}
在for循环中,输出只是所有根目录中的文件,而不是那些将蓝牙作为名称的文件。我在这做错了什么?
答案 0 :(得分:4)
这是因为你正在检查name
是否包含“蓝牙”,而不是fileName
是否包含“bluetooth”这个词
return name.contains("bluetooth");
应更改为return filename.contains("bluetooth");
但是,按照您尝试实施的方式,将其更改为return filename.contains(name);
,以便您实际检查fileName
是否包含您指定的name
。< / p>
另请注意,“蓝牙”可能与“{蓝牙”或“蓝牙”contains()
的评估方式不同。如果您想要不区分大小写的搜索,那么我建议standardize
为您的名字。将name
设置为小写,然后使用filename.toLowerCase().contains(name.toLowerCase())
进行检查。类似的东西:
public class Filter implements FilenameFilter {
String name;
public Filter(String name) {
this.name = name;
}
@Override
public boolean accept(File dir, String filename) {
//If you want to perform a case-insensitive search
return filename.toLowerCase().contains(name.toLowerCase());
}
}
答案 1 :(得分:1)
您正在调用属性名称中包含的方法,而是在参数filename中调用它。您还应该从方法中删除文字字符串,如下所示:
filename.contains(name)
这样您就可以使用为其创建的属性,并可以在其他情况下重用该类。这同样适用于searchForBluetoothFolder方法。
答案 2 :(得分:1)
FileFilter folderFilter = new FileFilter() {
@Override
public boolean accept(File file) {
return file.isDirectory() && file.getName().contains("bluetooth");
}
};
File[] files = f.listFiles(folderFilter);
答案 3 :(得分:1)
package Logic;
import java.io.File;
import java.io.FilenameFilter;
public class Filter implements FilenameFilter {
String name;
public Filter(String name) {
this.name = name;
}
@Override
public boolean accept(File dir, String filename) {
return filename.contains("bluetooth");
}
}