我正在使用Java的Windows桌面应用程序中工作。在我的应用程序中,需要搜索所有.php。为此,
这里我使用递归方法。
import java.io.File;
public class Copier {
public static void find(String source,String rep) {
File src = new File(rep);
if (src!= null && src.exists() && src.isDirectory()) {
String[] tab = src.list();
if (tab != null) {
for(String s : tab) {
File srcc = new File(rep+"\\"+s);
if (srcc.isFile()) {
if (srcc.getName().matches(".*"+source+"$")) {
System.out.println(s);
}
} else {
find(source,srcc.getAbsolutePath());
}
}
} else {
//System.out.println(" list is null");
}
}
}
这里我使用迭代算法与广度优先搜索队列但不起作用
import java.io.File;
import java.util.LinkedList;
public class Copier {
public static void find(String source,String rep)
{
File src=new File(rep);
LinkedList<File> qu=new LinkedList();
if(src!=null && src.exists() && src.isDirectory())
{
File[] tab=src.listFiles();
if(tab!=null)
{
for(File s:tab)
{
qu.addLast(s);
}
while(!qu.isEmpty())
{
File srcc=qu.getFirst();
qu.removeFirst();
if(srcc.isFile())
{
if(srcc.getName().matches(".*"+source+"$"))
System.out.println(srcc.getName());
}
else
{
System.out.println(srcc.getName());
qu.addLast(srcc);
}
}
}
}
}
public static void main(String[] args)
{
try {
find(".php","C:\\AppServ");
} catch (Exception e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:1)
阿努阿尔,
尝试使用Apache Commons IO 您可以使用描述为here in API Javadoc的班级
org.apache.commons.io.FileUtils。
它提供了非常有用,性能优化且无错误的静态方法来搜索文件(listFiles和iterateFiles方法),复制/移动文件和目录,在“一行代码”中读取文件到String更好的东西。
没有必要重新发明轮子;)
答案 1 :(得分:0)
您应该尝试不对第一个文件夹/路径和子文件夹产生影响。瑜伽正在做的是从src文件夹中获取所有文件和文件夹并将它们添加到队列中。然后删除第一个并检查它是否是文件。如果是,则如果它与您打印的图案匹配。如果它不是文件,则打印名称并再次将其添加到队列中!
想一想。如果您的src文件夹包含一个文件夹,您将其从队列中取出,将其重新添加并重复,直到队列为空(当然它永远不会出现)。
你需要更像这样的东西
public static void find(String source,String rep) {
String pattern = ".*"+source+"$";
LinkedList<File> qu = new LinkedList<File>();
File src = new File(rep);
qu.add(src);
while(!qu.isEmpty()) {
File srcc = qu.removeFirst();
if(srcc!=null && srcc.exists()) {
if (srcc.isDirectory()) {
File[] tab=srcc.listFiles();
for(File s: srcc.listFiles()) {
qu.addLast(s);
}
} else if (srcc.isFile()) {
if(srcc.getName().matches(pattern)) {
System.out.println(srcc.getName());
}
}
}
}
}
如果当前文件是目录,则将所有子文件添加到队列中,如果是文件,则检查名称是否匹配。