我正在用Java编写一个程序来搜索一段文本
我把这3个作为输入
这是我的代码
public void theRealSearch(String dirToSearch, String txtToSearch, boolean isRecursive) throws Exception
{
File file = new File(dirToSearch);
String[] fileNames = file.list();
for(int j=0; j<fileNames.length; j++)
{
File anotherFile = new File(fileNames[j]);
if(anotherFile.isDirectory())
{
if(isRecursive)
theRealSearch(anotherFile.getAbsolutePath(), txtToSearch, isRecursive);
}
else
{
BufferedReader bufReader = new BufferedReader(new FileReader(anotherFile));
String line = "";
int lineCount = 0;
while((line = bufReader.readLine()) != null)
{
lineCount++;
if(line.toLowerCase().contains(txtToSearch.toLowerCase()))
System.out.println("File found. " + anotherFile.getAbsolutePath() + " at line number " + lineCount);
}
}
}
}
当递归设置为true时,程序返回FILENOTFOUNDEXCEPTION
所以,我提到了我想要实现这个程序的网站并编辑了我的程序。这是怎么回事
public void theRealSearch(String dirToSearch, String txtToSearch, boolean isRecursive) throws Exception
{
File[] files = new File(dirToSearch).listFiles();
for(int j=0; j<files.length; j++)
{
File anotherFile = files[j];
if(anotherFile.isDirectory())
{
if(isRecursive)
theRealSearch(anotherFile.getAbsolutePath(), txtToSearch, isRecursive);
}
else
{
BufferedReader bufReader = new BufferedReader(new FileReader(anotherFile));
String line = "";
int lineCount = 0;
while((line = bufReader.readLine()) != null)
{
lineCount++;
if(line.toLowerCase().contains(txtToSearch.toLowerCase()))
System.out.println("File found. " + anotherFile.getAbsolutePath() + " at line number " + lineCount);
}
}
}
}
然后完美的工作。两个片段之间的唯一区别是创建文件的方式,但它们对我来说看起来一样!!
有人能指出我搞砸的地方吗?
答案 0 :(得分:1)
在第二个例子中,它使用listFiles()来返回文件。在你的例子中,它使用list(),它只返回文件的名称 - 这里是错误。
答案 1 :(得分:1)
第一个例子中的问题在于file.list()
返回文件名数组,而不是路径。如果要修复它,只需在创建文件时将file
作为参数传递,以便将其用作父文件:
File anotherFile = new File(file, fileNames[j]);
现在它假定anotherFile
位于file
所代表的目录中,这应该有效。
答案 2 :(得分:-1)
在构建File对象时,需要包含基目录,因为@fivedigit指出。
File dir = new File(dirToSearch);
for(String fileName : file.list()) {
File anotherDirAndFile = new File(dir, fileName);
完成后我会关闭你的文件,我会避免使用throws Exception
。