概述

由来

资源(Resource)在Hutool中是一个广泛的概念,凡是存储数据的地方都可以归类到资源,那为何要提供一个如此抽象的接口呢?

在实际编码当中,我们需要读取一些数据,比如配置文件、文本内容、图片甚至是任何二进制流,为此我们要加入很多的重载方法,比如:

  1. read(File file){...}
  2. read(InputStream in){...}
  3. read(byte[] bytes){...}
  4. read(URL url){...}

等等如此,这样会造成整个代码变得非常冗余,查找API也很费劲。其实无论数据来自哪里,最终目的是,我们想从这些地方读到byte[]或者String。那么,我们就可以抽象一个Resource接口,让代码变得简单:

  1. read(Resource resource){...}

用户只需传入Resource的实现即可。

定义

常见的,我们需要从资源中获取流(getStream),获取Reader来读取文本(getReader),直接读取文本(readStr),于是定义如下:

  1. public interface Resource {
  2. String getName();
  3. URL getUrl();
  4. InputStream getStream();
  5. BufferedReader getReader(Charset charset);
  6. String readStr(Charset charset);
  7. }

关于Resource的详细定义见:Resource.java

定义了Resource,我们就可以预定义一些特别的资源:

  • BytesResource 从byte[]中读取资源
  • InputStreamResource 从流中读取资源
  • StringResource 从String中读取资源
  • UrlResource 从URL中读取资源
  • FileResource 从文件中读取资源
  • ClassPathResource 从classpath(src/resources下)中读取资源
  • WebAppResource 从web root中读取资源
  • MultiResource 从多种资源中混合读取资源
  • MultiFileResource 从多个文件中混合读取资源

当然,我们还可以根据业务需要自己实现Resource接口,完成自定义的资源读取。

为了便于资源的查找,可以使用ResourceUtil快捷工具来获得我们需要的资源。