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的工作原理,进行调试或学习其设计思路。 3. **Overview (Guava Google Core Libraries for Java 22.0 API).htm**:虽然文件名中提及的是22.0版本,但可以推断这应该是...
3. **try-with-resources**:Java 7中新增的try-with-resources语句简化了资源管理,自动关闭在try块中打开的实现了AutoCloseable接口的对象。 4. **NIO.2**:Java 7引入了新的非阻塞I/O模型(NIO.2),增加了对...
- src/main/resources:资源文件目录,可能存放配置文件、OCR的API密钥等。 - pom.xml或build.gradle:构建文件,定义项目依赖和构建规则。 - logs:日志文件夹,存储爬虫运行的日志信息。 - target或build:编译后...
【描述】提及的"基于SpringBoot的秒杀系统源码数据库"表明此压缩包包含了一个实现秒杀功能的系统源代码,以及与之相关的数据库设计。秒杀系统是电商领域常见的一种促销手段,通过限时限量的销售方式吸引用户,对系统...
`java8-functional-helpers` 应该确保与标准 Java 8 API 的良好兼容性,同时可能提供了与第三方库如 Guava、Vavr 等的互操作性,以增强功能和性能。 总之,`java8-functional-helpers` 项目旨在弥补 Java 8 流 API...
4. **Maven插件和依赖**:为了构建和管理Drools项目,lib中可能包含了Maven的相关库,如maven-compiler-plugin和maven-resources-plugin,以及其依赖的jar包,帮助开发者进行自动化构建。 5. **JAXB和JDOM**:这些...
设计良好的公共资源模块应该提供清晰、一致的API接口,使得其他模块或应用可以方便地使用其功能。接口设计应遵循单一职责原则,避免过大的方法和过多的参数。 3. **线程安全**: 公共资源经常涉及到多线程环境下...
Google的Guava库提供了`Resources`类,可以方便地读取类路径中的资源: ```java import com.google.common.io.Resources; Properties prop = new Properties(); try { prop.load(Resources.getResource("config....
使用try-with-resources语句或实现AutoCloseable接口可以确保资源在使用完毕后正确关闭,防止内存泄漏和资源浪费。 4. **单例模式**:公共资源常以单例模式存在,保证系统中只有一个实例,提供全局访问点,如配置...
Java提供了多种库来处理图像,如Java Image I/O API或第三方库如ImageMagick、Guava等。通过调整压缩算法和质量参数,可以在保持图片质量的同时减小文件大小。 **5. Maven管理:** Maven作为项目构建工具,负责管理...
通过深入学习这本书,你可以掌握Java 7中的新特性,优化你的代码,并提升开发效率。下面将详细探讨Java 7中的关键知识点。 1. **自动资源管理(try-with-resources)** Java 7引入了自动资源管理,它允许你在`try`...
Google的Guava库提供了一个方便的`Resources`类,可以从类路径读取资源: ```java Properties props = Resources.asCharSource(Resources.getResource("config.properties"), Charsets.UTF_8).readLines(new ...
标题 "IO、文件、NIO 最佳阅读资料与实践" 提到的是关于Java中的输入输出(IO)和非阻塞I/O(NIO)的相关学习资源和实际操作指南。在这个领域,开发者需要理解和掌握如何有效地读写数据,管理文件,以及在高并发环境...
尽管Java标准库提供了基础的压缩功能,但第三方库如Apache Commons Compress和Google's Guava提供了更高级的功能和更友好的API。例如,它们支持更多的压缩格式(如GZIP、BZIP2等)和更复杂的压缩选项。 8. **多...
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 ...
- **src/main/resources**:配置文件和其他非Java资源的存放位置,如MyBatis的Mapper XML文件。 - **src/main/webapp**:静态资源(HTML、CSS、JavaScript)和Web应用的入口(如index.jsp)。 6. **配置过程**: ...
通常,一个完整的Java项目除了"src"目录外,还会包含"build"或"target"目录(编译结果)、"lib"目录(依赖的外部库)、"resources"目录(非Java代码的资源文件),以及"Maven"或"Gradle"的配置文件等。 在实际开发...
如果项目涉及数据分析,那么Java的集合框架(如ArrayList、HashMap)、Stream API以及可能的第三方库如Apache Commons Lang、Guava或Google Gson也可能被广泛使用。 对于Web开发,如果PopularBite有前端界面,那么...
2. **Java标准库应用**:可能会看到如何使用Java内置的API,如I/O流、网络编程、日期时间API等。 3. **框架和库**:可能包含Spring、Hibernate、MyBatis等流行框架的实例,或者像Guava、Apache Commons这样的实用库...
通过分析其源代码,我们可以学习到许多关于Java开发的知识点。 首先,"crazyWeather"项目名暗示了它可能涉及到实时天气数据的获取、处理和展示。这通常会涵盖网络编程、JSON数据解析、多线程等技术。在Java中,我们...