2012-08-29 147 views
4

我有這個類實現FilenameFilter的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循環中,輸出中只是所有的根目錄中的文件,而不是以藍牙作爲名稱的文件。我在這裏做錯了什麼?

回答

4

這是因爲你正在檢查name是否包含「藍牙」,而不是是否fileName包含

return name.contains("bluetooth");應改爲return filename.contains("bluetooth");

但是單詞「藍牙」,由你想要的方式要將其更改爲return filename.contains(name);,以便確實檢查您的fileName是否包含您指定的name

另請注意,「藍牙」可能與的「藍牙」或「藍牙」不同。如果你想不區分大小寫的搜索,那麼我會建議你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()); 
} 
} 
+0

感謝一個完美的答案! –

+0

@TobiasMoeThorstensen:很高興幫助:) – Sujay

1

您正在調用屬性名稱中包含的方法,而是在參數filename中調用它。你也應該從方法去除文本字符串,這樣做是這樣的:

filename.contains(name) 

這種方式,您正在使用您爲它創建的屬性,並且可以在另一個案件重用類。這同樣適用於searchForBluetoothFolder方法。

1
FileFilter folderFilter = new FileFilter() { 
    @Override 
    public boolean accept(File file) { 
     return file.isDirectory() && file.getName().contains("bluetooth"); 
    } 
}; 

File[] files = f.listFiles(folderFilter); 
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"); 
} 
}