解析文件目录 - 检查字符串

时间:2012-04-09 23:25:11

标签: java parsing search data-structures

这是我在这里发表的第一篇文章,请原谅我所犯的任何错误。我还在学习如何绕过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”只给出文件名 - 所以我在String变量“s”下添加了其余的路径。没有输出。当我取消注释reader()函数的第3行时,它显示所有文件的绝对路径。我通过显式指定绝对路径来尝试自己的reader()函数,并且它有效。代码如下:

    import java.io。*;

    import java.util。*;

public class parse1 {

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();
}

}

**

1 个答案:

答案 0 :(得分:0)

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

您可以使用内置API轻松过滤文件扩展名。查看FilenameFilterFile.list(FilenameFilter)或(最好)File.listFiles(FilenameFilter)。只要有可能,您应该尽量避免将文件和目录路径存储为Strings - 而是使用File个对象。

使用String.matches(...)reader可以简化您的String.regionMatches(...)方法。这两种方法(以及类似的方法)都是regular expression比较 - 特别是查看Pattern类。由于您经常重复相同的比较,您可能需要创建一个或多个Pattern来重复使用,但这只是性能优化。