Blog

It's a Wonderful Life

使用java查找字符串在文件中出现了多少次

2017-04-25 18:05 Posted in Learn with 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的,所以可以直接使用。

这是在开发工具类的时候的一个比较好的习惯。