这是我在这里发表的第一篇文章,请原谅我所犯的任何错误。我还在学习如何绕过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();
}
}
**
答案 0 :(得分:0)
我看到的最大问题是您应该在目录上递归调用traverse()
,并且只应在文件上调用reader()
。您还应该尝试逐步调试调试器中有问题的代码行。在Eclipse或任何其他IDE中设置断点并逐步执行代码非常容易。
您可以使用内置API轻松过滤文件扩展名。查看FilenameFilter
和File.list(FilenameFilter)
或(最好)File.listFiles(FilenameFilter)
。只要有可能,您应该尽量避免将文件和目录路径存储为Strings
- 而是使用File
个对象。
使用String.matches(...)
或reader
可以简化您的String.regionMatches(...)
方法。这两种方法(以及类似的方法)都是regular expression比较 - 特别是查看Pattern
类。由于您经常重复相同的比较,您可能需要创建一个或多个Pattern
来重复使用,但这只是性能优化。