1

这是我在这里的第一篇文章,所以请原谅我的任何错误。我仍在学习如何在 Stack Exchange 中寻找出路。

我正在尝试编写一个 Java 程序,该程序试图扫描一个充满 .txt、.rtf 或 .doc 文件(仅此而已)的目录。目的是搜索目录中的所有文件,并找出文件中是否存在特定字符串。如果是,则返回字符串和找到该字符串的文件名。

该程序的目的是,这是一个学校项目,其中该程序扫描呼叫中心员工的个人文件夹以检查他们是否存储了任何 CC/DC 号码,如果是,则报告文件夹名称 - 以减少 CC 欺诈。

当我单独指定文件名时,搜索功能非常简单。但是,搜索目录并将文件传递给搜索功能让我很难过。

到目前为止,我已经发布了我的代码,如果你们可以看一下并给我一些反馈/建议,我将非常感激。提前致谢

import java.io.*;
import java.util.*;

public class parse2{

void traverse(String directory) throws FileNotFoundException   
    {  
        File dir = new File(directory);  
            if (dir.isDirectory())  
        {  
                   String[] children = dir.list();  
                   for (int i=0; i<children.length; i++)   
                {  
            //System.out.println("\n" + children[i]);
                    reader(children[i]);  
                }  
            }  

     }


void reader(String loc) throws FileNotFoundException
{   //System.out.println("\nC:/Documents and Settings/h4d35/Desktop/javatest/chk/"+loc);
    String s = ("C:/Documents and Settings/h4d35/Desktop/javatest/chk/"+loc);
    //System.out.println("\n"+s);
            FileReader fr = new FileReader(loc);
    BufferedReader br = new BufferedReader(fr);
    Scanner sc = new Scanner(br);
    char[] chkArray;
    int chk=1;
    char ch;
    while(sc.hasNext())
    {
        String chkStr = sc.next();
        chkArray = chkStr.toCharArray();
        if ((chkArray[0]=='4')&&(chkStr.length()>13))
        {   for(int i=0;i<chkArray.length;i++)
            {   ch=chkArray[i];
                if((ch=='0')||(ch=='1')||(ch=='2')||(ch=='3')||(ch=='4')||(ch=='5')||(ch=='6')||(ch=='7')||(ch=='8')||(ch=='9'))
                {   chk=0;
                    continue;
                }
                else 
                {   chk=1;
                    break;
                }
            }
            if(chk==0)
                System.out.println("\n"+ chkStr);
        }
        else
        if((chkArray[0]=='5')&&(chkStr.length()>13))
        {   for(int i=0;i<chkArray.length;i++)
            {   ch=chkArray[i];
                if((ch=='0')||(ch=='1')||(ch=='2')||(ch=='3')||(ch=='4')||(ch=='5')||(ch=='6')||(ch=='7')||(ch=='8')||(ch=='9'))
                {   chk=0;
                    continue;
                }
                else 
                {   chk=1;
                    break;
                }
            }
            if(chk==0)
            System.out.println("\n"+ chkStr);
        }
        else
        if((chkArray[0]=='6')&&(chkStr.length()>13))
        {   for(int i=0;i<chkArray.length;i++)
            {   ch=chkArray[i];
                if((ch=='0')||(ch=='1')||(ch=='2')||(ch=='3')||(ch=='4')||(ch=='5')||(ch=='6')||(ch=='7')||(ch=='8')||(ch=='9'))
                {   chk=0;
                    continue;
                }
                else 
                {   chk=1;
                    break;
                }
            }
            if(chk==0)
            System.out.println("\n"+ chkStr);
        }
    }
}

public static void main(String args[]) throws FileNotFoundException
{   
    parse2 P = new parse2();
    P.traverse("C:/Documents and Settings/h4d35/Desktop/javatest/chk");
}

}

**

  • 编辑:变量“loc”只给出文件名 - 所以我在字符串变量“s”下添加了路径的其余部分。没有输出。当我取消注释 reader() 函数的第 3 行时,它会显示所有文件的绝对路径。我通过显式指定绝对路径自己尝试了 reader() 函数,它起作用了。下面的代码:

    导入java.io.*;

    导入 java.util.*;

公共类解析1{

void read() throws FileNotFoundException
{   FileReader fr = new FileReader("C:/Documents and Settings/h4d35/Desktop/javatest/chk/Call back customer.txt");
    BufferedReader br = new BufferedReader(fr);
    Scanner sc = new Scanner(br);
    char[] chkArray;
    int chk=1;
    char ch;
    while(sc.hasNext())
    {
        String chkStr = sc.next();
        chkArray = chkStr.toCharArray();
        if ((chkArray[0]=='4')&&(chkStr.length()>13))
        {   for(int i=0;i<chkArray.length;i++)
            {   ch=chkArray[i];
                if((ch=='0')||(ch=='1')||(ch=='2')||(ch=='3')||(ch=='4')||(ch=='5')||(ch=='6')||(ch=='7')||(ch=='8')||(ch=='9'))
                {   chk=0;
                    continue;
                }
                else 
                {   chk=1;
                    break;
                }
            }
            if(chk==0)
                System.out.println("\n"+ chkStr);
        }
        else
        if((chkArray[0]=='5')&&(chkStr.length()>13))
        {   for(int i=0;i<chkArray.length;i++)
            {   ch=chkArray[i];
                if((ch=='0')||(ch=='1')||(ch=='2')||(ch=='3')||(ch=='4')||(ch=='5')||(ch=='6')||(ch=='7')||(ch=='8')||(ch=='9'))
                {   chk=0;
                    continue;
                }
                else 
                {   chk=1;
                    break;
                }
            }
            if(chk==0)
            System.out.println("\n"+ chkStr);
        }
        else
        if((chkArray[0]=='6')&&(chkStr.length()>13))
        {   for(int i=0;i<chkArray.length;i++)
            {   ch=chkArray[i];
                if((ch=='0')||(ch=='1')||(ch=='2')||(ch=='3')||(ch=='4')||(ch=='5')||(ch=='6')||(ch=='7')||(ch=='8')||(ch=='9'))
                {   chk=0;
                    continue;
                }
                else 
                {   chk=1;
                    break;
                }
            }
            if(chk==0)
            System.out.println("\n"+ chkStr);
        }
    }
}

public static void main(String args[]) throws FileNotFoundException
{   
    parse1 P = new parse1();
    P.read();
}

}

**

4

1 回答 1

0

我看到的最大问题是你应该递归地调用traverse()目录,并且应该只调用reader()文件。您还应该尝试在调试器中单步执行有问题的代码行。在 Eclipse 或任何其他 IDE 中设置断点和单步执行代码非常容易。

您可以使用内置 API 轻松按文件扩展名进行过滤。签出FilenameFilterand File.list(FilenameFilter)or (preferably) File.listFiles(FilenameFilter)。只要有可能,您应该尽量避免将文件和目录路径存储为Strings-- 而是使用File对象。

您的reader方法可以通过使用来简化String.matches(...)or String.regionMatches(...)。这两种方法(以及类似的方法)都是正则表达式比较——特别是看看这个Pattern类。由于您经常重复相同的比较,因此您可能希望创建一个或多个Patterns 以一遍又一遍地重用,但这只是性能优化。

于 2012-04-10T00:28:51.590 回答