【问题标题】:Parsing a Directory of files - Check for a String解析文件目录 - 检查字符串
【发布时间】:2012-04-09 23:25:11
【问题描述】:

这是我在这里的第一篇文章,请原谅我的任何错误。我仍在学习如何在 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();
}

}

**

【问题讨论】:

  • 您正在将目录的完整路径传递给traverse() 方法,但是在打印list() 没有给您完整路径的文件名时您没有注意到吗?
  • 我在这里没有看到任何问题。
  • @madth3 - 为了克服这个问题,我刚刚将它添加到我的代码中-----------> String s = ("C:/Documents and Settings/h4d35/Desktop/ javatest/chk/"+loc); //System.out.println("\n"+s); FileReader fr = new FileReader(s);
  • @KenWhite - 对不起,如果我不清楚。你能指出程序中的错误吗?它正确读取文件并正确搜索 reqd 字符串(这是单独完成的),当尝试组合这两个函数时,它似乎不起作用。提前谢谢
  • 如果您更改了代码,请编辑问题以反映这一点。尽可能清楚地指出此类代码的影响(错误结果、错误等......)

标签: java parsing search data-structures


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的帮助.. 我一定会通过这些并尽可能优化代码。
猜你喜欢
  • 2018-07-18
  • 2021-09-14
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2013-08-22
相关资源
最近更新 更多