Blog
It's a Wonderful Life
使用java查找字符串在文件中出现了多少次
这是一道经常在面试中出现的题目,思路是使用输入流按行读取文件中的数据,然后用取出的每一行查找有无目标字符串,如果有,就把它从这一行中删除。
当这一行已经不再包含目标字符串,或者这一行的字符数量比目标字符串还要少的时候,就取出下一行进行上述比对流程。
代码如下:
package com.leo.util;
import java.io.BufferedReader;
import java.io.FileReader;
public final class StringCounter
{
private StringCounter()
{
throw new AssertionError();
}
public static int count(String fileName, String target)
{
int counter = 0;
try (FileReader fr = new FileReader(fileName))
{
try (BufferedReader br = new BufferedReader(fr))
{
String line = null;
while ((line = br.readLine()) != null)
{
int index = -1;
while (line.length() >= target.length() && (index = line.indexOf(target)) >= 0)
{
counter++;
line = line.substring(index + target.length());
}
}
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
return counter;
}
}
值得注意的是,在代码中我们使用了包含资源的try
语句,这样就不必显式关闭输入流了。
另外,由于这是一个工具类,所以在定义的时候我们将它定义为final
,并且把它的构造器定义为private
,且在构造器内部抛出异常,这样就可以保证工具类不会被实例化,而它的方法由于是static
的,所以可以直接使用。
这是在开发工具类的时候的一个比较好的习惯。