`
sungang_1120
  • 浏览: 321579 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

Guava API学习之Resources

阅读更多

 

       Resources提供提供操作classpath路径下所有资源的方法。除非另有说明,否则类中所有方法的参数都不能为null。虽然有些方法的参数是URL类型的,但是这些方法实现通常不是以HTTP完成的;同时这些资源也非classpath路径下的。
  下面两个函数都是根据资源的名称得到其绝对路径,从函数里面可以看出,Resources类 中的getResource函数都是基于java中ClassLoader类的getResource函数来实现的,只是Resources类中的 getResource函数给我们封装了ClassLoader对象的获取,使得用户不需要自己去获取ClassLoader对象。

 

 

 public static URL getResource(String resourceName) {
     ClassLoader loader = Objects.firstNonNull(
             Thread.currentThread().getContextClassLoader(),
             Resources.class.getClassLoader());
     URL url = loader.getResource(resourceName);
     checkArgument(url != null, "resource %s not found.", resourceName);
     return url;
}

 public static URL getResource(Class<?> contextClass, String resourceName) {
     URL url = contextClass.getResource(resourceName);
     checkArgument(url != null, "resource %s relative to %s not found.",
             resourceName, contextClass.getName());
     return url;
 }

 上面两个函数处理完后都是返回URL类型的对象,第一个getResource函数中Objects.firstNonNull函数原型为

 

 

public static <T> T firstNonNull(@Nullable T first, @Nullable T second)

 其实现如下:

 

 

public static <T> T firstNonNull(@Nullable T first, @Nullable T second) {
    return first != null ? first : checkNotNull(second);
}

 

从其实现可以看出,firstNonNull函数返回其两个参数中首先不为null的对象;如若两个参数都为null,则该函数将会抛出类型为 NullPointerException异常。好了,再回到Resources类中来,上面的两个getResource函数返回的对象都是URL类型 的,而观察Resources类其他函数,都可以接受URL类型的参数,如下所示:

public static InputSupplier<InputStream> newInputStreamSupplier(URL url)
public static ByteSource asByteSource(URL url)
public static InputSupplier<InputStreamReader> newReaderSupplier(URL url, Charset charset)
public static CharSource asCharSource(URL url, Charset charset)
public static byte[] toByteArray(URL url) throws IOException
public static String toString(URL url, Charset charset) throws IOException
public static <T> T readLines(URL url, Charset charset, LineProcessor<T> callback)  throws IOException
public static List<String> readLines(URL url, Charset charset) throws IOException
public static void copy(URL from, OutputStream to) throws IOException

 下面分别介绍这些函数的用法:

InputSupplier<InputStream> inputStreamInputSupplier = Resources.newInputStreamSupplier(resource);
InputStream input = inputStreamInputSupplier.getInput();

ByteSource byteSource = Resources.asByteSource(resource);
InputStream inputStream = byteSource.openStream();

 newInputStreamSupplier和asByteSource函数都是以字节形式来读取resource中的数据。可以看出,两个函数最后都可以转换成我们熟悉的InputStream来操作。

InputSupplier<InputStreamReader> inputSRS = Resources.newReaderSupplier(resource, Charsets.UTF_8);
Reader input1 = inputSRS.getInput();

CharSource charSource = Resources.asCharSource(resource, Charsets.UTF_8);
Reader reader = charSource.openStream();

 newReaderSupplier和asCharSource函数都是以字符的形式来读取resource中的数据。同上面两个函数一样,这里说的两个函数都可以转换为Reader类操作。

byte[] bytes = Resources.toByteArray(resource);
String string = Resources.toString(resource, Charsets.UTF_8);

 上面两个函数可以直接将resource中的资源数据转换为字节数组和字符数组形式。

List<String> stringList = Resources.readLines(resource, Charsets.UTF_8);
Lines lines = (Lines)Resources.readLines(resource, Charsets.UTF_8, 
    new LineProcessor<Object>() {
        Lines lines = new Lines();
        @Override
        public boolean processLine(String line) throws IOException {
              return lines.getStringList().add(line);
        }

        @Override
        public Lines getResult() {
              return lines;
        }
});

 Lines类定义

public class Lines {
    private List<String> stringList;

    public Lines() {
        stringList = Lists.newArrayList();
    }

    public List<String> getStringList() {
        return stringList;
    }

    public void setStringList(List<String> stringList) {
        this.stringList = stringList;
    }

    @Override
    public String toString() {
        return stringList.toString();
    }
}

 上面两个函数都是从resource中以Charsets.UTF_8字符集形式一行一行的读取里面的内容。第二个函数我们自己实现了LineProcessor callback类,可以看出,我们可以对读取到的每一个进行相应的处理,非常的方便。其 实,Resources.readLines(resource, Charsets.UTF_8);函数内部还是调用了readLines(URL url, Charset charset, LineProcessor callback)函数,其实现如下:

 public static List<String> readLines(URL url, Charset charset)
         throws IOException {
     return readLines(url, charset, new LineProcessor<List<String>>() {
         final List<String> result = Lists.newArrayList();

         @Override
         public boolean processLine(String line) {
             result.add(line);
             return true;
         }

         @Override
         public List<String> getResult() {
             return result;
         }
     });
}

 最后一个要说的函数是copy(URL from, OutputStream to),这个函数可以将数据复制到所有OutputStream子类对象中,如下:

Resources.copy(resource, new FileOutputStream("/wyp.txt"));

 上面代码将resource中的数据复制到wyp.txt文件中。(完)

 

分享到:
评论

相关推荐

    guava-23.zip

    开发者可以通过查看源代码来更好地理解Guava的工作原理,进行调试或学习其设计思路。 3. **Overview (Guava Google Core Libraries for Java 22.0 API).htm**:虽然文件名中提及的是22.0版本,但可以推断这应该是...

    java 中文的API

    3. **try-with-resources**:Java 7中新增的try-with-resources语句简化了资源管理,自动关闭在try块中打开的实现了AutoCloseable接口的对象。 4. **NIO.2**:Java 7引入了新的非阻塞I/O模型(NIO.2),增加了对...

    java webmagic实现的爬虫

    - src/main/resources:资源文件目录,可能存放配置文件、OCR的API密钥等。 - pom.xml或build.gradle:构建文件,定义项目依赖和构建规则。 - logs:日志文件夹,存储爬虫运行的日志信息。 - target或build:编译后...

    基于SpringBoot的秒杀系统源码数据库.zip

    【描述】提及的"基于SpringBoot的秒杀系统源码数据库"表明此压缩包包含了一个实现秒杀功能的系统源代码,以及与之相关的数据库设计。秒杀系统是电商领域常见的一种促销手段,通过限时限量的销售方式吸引用户,对系统...

    java8-functional-helpers:Java 8 流 API 缺失的部分

    `java8-functional-helpers` 应该确保与标准 Java 8 API 的良好兼容性,同时可能提供了与第三方库如 Guava、Vavr 等的互操作性,以增强功能和性能。 总之,`java8-functional-helpers` 项目旨在弥补 Java 8 流 API...

    Drools Workbench6.5 lib.rar

    4. **Maven插件和依赖**:为了构建和管理Drools项目,lib中可能包含了Maven的相关库,如maven-compiler-plugin和maven-resources-plugin,以及其依赖的jar包,帮助开发者进行自动化构建。 5. **JAXB和JDOM**:这些...

    JAVA公共资源模块的设计与开发源码.rar

    设计良好的公共资源模块应该提供清晰、一致的API接口,使得其他模块或应用可以方便地使用其功能。接口设计应遵循单一职责原则,避免过大的方法和过多的参数。 3. **线程安全**: 公共资源经常涉及到多线程环境下...

    Java读取Properties文件的六种方法

    Google的Guava库提供了`Resources`类,可以方便地读取类路径中的资源: ```java import com.google.common.io.Resources; Properties prop = new Properties(); try { prop.load(Resources.getResource("config....

    JAVA公共资源模块的设计与开发.zip

    使用try-with-resources语句或实现AutoCloseable接口可以确保资源在使用完毕后正确关闭,防止内存泄漏和资源浪费。 4. **单例模式**:公共资源常以单例模式存在,保证系统中只有一个实例,提供全局访问点,如配置...

    java h5头像上传

    Java提供了多种库来处理图像,如Java Image I/O API或第三方库如ImageMagick、Guava等。通过调整压缩算法和质量参数,可以在保持图片质量的同时减小文件大小。 **5. Maven管理:** Maven作为项目构建工具,负责管理...

    Java 7编程高级进阶

    通过深入学习这本书,你可以掌握Java 7中的新特性,优化你的代码,并提升开发效率。下面将详细探讨Java 7中的关键知识点。 1. **自动资源管理(try-with-resources)** Java 7引入了自动资源管理,它允许你在`try`...

    java读取配置文件

    Google的Guava库提供了一个方便的`Resources`类,可以从类路径读取资源: ```java Properties props = Resources.asCharSource(Resources.getResource("config.properties"), Charsets.UTF_8).readLines(new ...

    IO、文件、NIO 最佳阅读资料与实践

    标题 "IO、文件、NIO 最佳阅读资料与实践" 提到的是关于Java中的输入输出(IO)和非阻塞I/O(NIO)的相关学习资源和实际操作指南。在这个领域,开发者需要理解和掌握如何有效地读写数据,管理文件,以及在高并发环境...

    JAVA文件压缩与解压缩实践,java解压缩zip文件,Java源码.zip

    尽管Java标准库提供了基础的压缩功能,但第三方库如Apache Commons Compress和Google's Guava提供了更高级的功能和更友好的API。例如,它们支持更多的压缩格式(如GZIP、BZIP2等)和更复杂的压缩选项。 8. **多...

    开发用jar包合集

    guava-jdk5-17.0.jar hamcrest-core-1.3.jar httpclient-4.2.2.jar httpclient-4.5.6.jar httpclient-cache-4.5.6.jar httpclient-win-4.5.6.jar httpcore-4.2.2.jar httpcore-4.4.10.jar ...

    ssm框架需要的全部jar包

    - **src/main/resources**:配置文件和其他非Java资源的存放位置,如MyBatis的Mapper XML文件。 - **src/main/webapp**:静态资源(HTML、CSS、JavaScript)和Web应用的入口(如index.jsp)。 6. **配置过程**: ...

    src_java_

    通常,一个完整的Java项目除了"src"目录外,还会包含"build"或"target"目录(编译结果)、"lib"目录(依赖的外部库)、"resources"目录(非Java代码的资源文件),以及"Maven"或"Gradle"的配置文件等。 在实际开发...

    PopularBite:快速浏览互联网上最受欢迎的东西

    如果项目涉及数据分析,那么Java的集合框架(如ArrayList、HashMap)、Stream API以及可能的第三方库如Apache Commons Lang、Guava或Google Gson也可能被广泛使用。 对于Web开发,如果PopularBite有前端界面,那么...

    LLN_JUG:Louvain-La-Neuve JUG 的源代码

    2. **Java标准库应用**:可能会看到如何使用Java内置的API,如I/O流、网络编程、日期时间API等。 3. **框架和库**:可能包含Spring、Hibernate、MyBatis等流行框架的实例,或者像Guava、Apache Commons这样的实用库...

    crazyWeather

    通过分析其源代码,我们可以学习到许多关于Java开发的知识点。 首先,"crazyWeather"项目名暗示了它可能涉及到实时天气数据的获取、处理和展示。这通常会涵盖网络编程、JSON数据解析、多线程等技术。在Java中,我们...

Global site tag (gtag.js) - Google Analytics