论apache重复造的轮子

今天分享一下apache所重复造的轮子(FileUtils.readLines)

在org.apache.cxf.helpers 这个包下有个工具类也叫做FileUtils,和我们平时常用的 org.apache.commons.io 下面的工具类名称一致。那么在开发中使用导包ctrl+shift+o 快捷键导包,非常容易引用错误包,如果不涉及到字符集编码还好,否则容易走弯路。

今天分析一下 这个同名工具中的一个同名方法:readFile(File file)

public static List readLines(File file) throws IOException

l两个类中的方法明、参数类型、个数、返回值、异常类型完全一致。
但是 io包下的 FileUtils 进行了重写,同时提供了
public static List readLines(File file, String encoding) throws IOException 这个方法,有了这个方法为编程提供了便捷。

比较一下具体实现:(比较简单)

  • cxf readLines 使用的是FileReader 读取文件 ,传入BufferedReader中,然后循环变量出每一行存入list ,然后返回。
  public static List<String> readLines(File file) throws Exception {
        if (!file.exists()) {
            return new ArrayList<String>();
        }
        BufferedReader reader = new BufferedReader(new FileReader(file));
        List<String> results = new ArrayList<String>();
        try {
            String line = reader.readLine();
            while (line != null) {
                results.add(line);
                line = reader.readLine();
            }
        } finally {
            reader.close();
        }
        return results;
    }
  • io包下的readFile方法逻辑更为严谨,明确判断了输入参数是文件,还是文件夹等。具体实现是使用的是同包下 IOUtils 提供的readLines方法这个方法中进行了 输入参数字符集的判断,如果字符集参数为空则使用InputStreamReader(input) 完成文件行读取,存入list返回。 如果字符集参数不为空 则使用了 InputStreamReader(InputStream in, String charsetName)
   public static List<String> readLines(File file, String encoding) throws IOException {
        InputStream in = null;
        try {
            in = openInputStream(file);
            return IOUtils.readLines(in, encoding);
        } finally {
            IOUtils.closeQuietly(in);
        }
    }


public static List<String> readLines(InputStream input, String encoding) throws IOException {
        if (encoding == null) {
            return readLines(input);
        } else {
            InputStreamReader reader = new InputStreamReader(input, encoding);
            return readLines(reader);
        }
    }



public static List<String> readLines(Reader input) throws IOException {
        BufferedReader reader = new BufferedReader(input);
        List<String> list = new ArrayList<String>();
        String line = reader.readLine();
        while (line != null) {
            list.add(line);
            line = reader.readLine();
        }
        return list;
    }

回到主题,apache为什么这么做呢?
1:减少依赖
2:完全两个团队开发相互不知道对方有轮子
3:。。。

你可能感兴趣的:(java基础)