guava学习--File1
ByteSource:表示一个可读的字节。通常情况下,我们期望的字节来源是一个文件,但它也可以从一个字节数组读取字节。
File f1 = new File("D:\\test2.txt");
ByteSource byteSource = Files.asByteSource(f1);
byte[] readBytes = byteSource.read();
assertThat(readBytes,is(Files.toByteArray(f1)));
ByteSink:表示一个可写的字节。我们可以将字节写入一个文件或另一个字节数组。
File dest = new File("D:\\test.txt");
dest.deleteOnExit();
ByteSink byteSink = Files.asByteSink(dest);
File file = new File("D:\\test2.txt");
byteSink.write(Files.toByteArray(file));
assertThat(Files.toByteArray(dest), is(Files.toByteArray(file)));
从ByteSource 向ByteSink 复制:
File dest = new File("D:\\test.txt");
dest.deleteOnExit();
File source = new File("D:\\test2.txt");
ByteSource byteSource = Files.asByteSource(source);
ByteSink byteSink = Files.asByteSink(dest);
byteSource.copyTo(byteSink); //其实就是将byteSource的字节写入byteSink,也即是写入byteSink对应的文件
assertThat(Files.toByteArray(dest), is(Files.toByteArray(source)));
ByteStreams 和 CharStreams
ByteStreams是一个实用的程序类,用来处理InputStream和OutputStream实例,CharStreams则是用来处理Reader和Writer实例的程序类。ByteStreams 和 CharStreams提供了一系列的方法来直接操作文件,与Files类提供的类似。
限制inputstream的大小:
File binaryFile = new File("D:\\test2.txt"); BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(binaryFile)); InputStream limitedInputStream = ByteStreams.limit(inputStream, 10); //不影响原始流的可读大小
assertThat(limitedInputStream.available(), is(10));
assertThat(inputStream.available(), is(218882));
Closer:
Closer closer = Closer.create();
try {
File destination = new File("D:\\test.txt");
destination.deleteOnExit();
BufferedReader reader = new BufferedReader(new FileReader("D:\\test2.txt"));
BufferedWriter writer = new BufferedWriter(new FileWriter(destination));
closer.register(reader);
closer.register(writer);
String line;
while ((line = reader.readLine()) != null) {
writer.write(line);
}
} catch (Throwable t) {
throw closer.rethrow(t);
} finally {
closer.close();
}
在上面的例子中, 我们简单的设置复制一个文本文件。首先,我们创建了一个Closer实例,之后创建BufferedReader和BufferedWriter,然后将 这些对象注册给创建的Closer实例。我们需要注意在这里提到的所有方法都使用InputSupplier和OutputSupplier,通过 Closer类来管理底层I/O资源的关闭,Guava建议,在进行原始I/O流、readers、writers操作时,最好使用Sources和 Sinks。
BaseEncoding:
在处理二进制数据时,我们有时需要将表示数据的字节转换成可打印的ASCII字符。当然,我们也需要能够将转成原始解码编码字节形式。BaseEncoding是一个抽象类,包含许多静态工厂方法,能够为不同编码方法创建实例。最简单的形式
File file = new File("D:\\test2.txt");
byte[] bytes = Files.toByteArray(file);
BaseEncoding baseEncoding = BaseEncoding.base64();
String encoded = baseEncoding.encode(bytes);
assertThat(Pattern.matches("[A-Za-z0-9+/=]+", encoded),is(true));
assertThat(baseEncoding.decode(encoded),is(bytes));
我们可以装饰OutputSuplier、ByteSink、 和Writer实例,这样字节会被编码成和它们写入时的一样。反过来,我们也可以将IntputStream、ByteSource和Reader实例
解 码成字符串。
File file = new File("D:\\test2.txt");
File encodedFile = new File("D:\\test3.txt");
encodedFile.deleteOnExit();
CharSink charSink = Files.asCharSink(encodedFile, Charsets.UTF_8);
BaseEncoding baseEncoding = BaseEncoding.base64();
ByteSink byteSink = baseEncoding.encodingSink(charSink);
ByteSource byteSource = Files.asByteSource(file);
byteSource.copyTo(byteSink);
String encodedBytes = baseEncoding.encode(byteSource.read());
assertThat(encodedBytes, is(Files.toString(encodedFile, Charsets.UTF_8)));
上面的例子中,我们创建了一个File对象,一个提供二进制文件,另外的是我们准备复制的原始副本。接下来通过file对象创建了一个CharSink实 例。
之后,创建了BaseEncoding实例进行base64算法的编码和解码。我们使用BaseEncoding实例来装饰之前在ByteSink构 造的CharSink,因此字节
将自动的被编码成和它们写入时一样。之后为我们的目标文件创建了ByteSource实例并复制字节到我们的 ByteSink。然后我们断言,我们原始文件
的字节编码与目标文件转换成的字符串一致。
guava学习--File1的更多相关文章
- Guava学习笔记目录
Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libra ...
- guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁
guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁 1,本文翻译自 http://eclipsesource.com/blogs/2012/06/06/cleaner-code- ...
- guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用
guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用 1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection ...
- Guava学习
Guava学习笔记目录 Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concu ...
- [置顶] Guava学习之ArrayListMultimap
ArrayListMultimap类的继承关系如下图所示: Guava ArrayListMultimap List Multimap 是一个接口,继承自 Multimap 接口.ListMultim ...
- [置顶] Guava学习之Splitter
Splitter:在Guava官方的解释为:Extracts non-overlapping substrings from an input string, typically by recogni ...
- [置顶] Guava学习之Iterators
Iterators类提供了返回Iterator类型的对象或者对Iterator类型对象操作的方法.除了特别的说明,Iterators类中所有的方法都在Iterables类中有相应的基于Iterable ...
- [置顶] Guava学习之Lists
Lists类主要提供了对List类的子类构造以及操作的静态方法.在Lists类中支持构造ArrayList.LinkedList以及newCopyOnWriteArrayList对象的方法.其中提供了 ...
- [置顶] Guava学习之Immutable集合
Immutable中文意思就是不可变.那为什么需要构建一个不可变的对象?原因有以下几点: 在并发程序中,使用Immutable既保证线程安全性,也大大增强了并发时的效率(跟并发锁方式相比).尤其当一个 ...
随机推荐
- Java反射深入浅出(一)
在JVM中对一个类实例的创建,有两种方式,一种是编译时,一种是运行时.两种方式在开发过程中都是十分重要的.在Java中无时无刻无处不在的Java对象,实例化的过程也就变得尤为引人瞩目.我们经常用new ...
- Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解
在上篇博客中,我们介绍了<hibernate基本概念和体系结构>,也对hibernate框架有了一个初步的了解,本文我将向大家简单介绍Hibernate的核心API调用库,并讲解一下它的基 ...
- 夺命雷公狗-----React---1--页面的渲染
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Bug测试报告--食物链教学工具--奋斗吧兄弟
组名:奋斗吧兄弟 测试时间:2016-11-23 15:15 测试者:李权(nice!团队) 代码地址:HTTPS: https://git.coding.net/li_yuhuan/FoodChai ...
- 使用AppCan实现分享网站功能
使用AppCan实现分享网站功能 昨天我们实现了最基本的文字分享功能,今天呢,我们来实现基本的分享网站功能: 微信指引部分这里不再复述,具体请参见:http://newdocx.appcan.cn/i ...
- 配置jsp开发环境
一.安装jdk(http://pan.baidu.com/s/1sjk9a2p) 二.配置java环境变量 安装好后,配置环境变量:计算机——右击——属性——高级系统设置设置——环境变量 系统变量(没 ...
- Unix/Linux编程实践教程(0:文件、终端、信号)
本来只打算读这本书socket等相关内容,但书写得实在好,还是决定把其余的内容都读一下. 阅读联机帮助的一个示例: open系统调用: read系统调用: Unix的time: 上面的printf可以 ...
- Linux phpwind论坛的安装
1:新建文件夹phpwind
- mac攻略(二) -- 简单配置php开发环境
最简单直接的方式还是使用 Mac 上自带的 Apache 和 PHP. 1.启动 Apache 1>启动apache $sudo apachectl start; 2>启动后,在浏览器 ...
- struct内存对齐1:gcc与VC的差别
struct内存对齐:gcc与VC的差别 内存对齐是编译器为了便于CPU快速访问而采用的一项技术,对于不同的编译器有不同的处理方法. Win32平台下的微软VC编译器在默认情况下采用如下的对齐规则: ...