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的更多相关文章

  1. Guava学习笔记目录

    Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libra ...

  2. guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁

    guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁 1,本文翻译自 http://eclipsesource.com/blogs/2012/06/06/cleaner-code- ...

  3. guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用

    guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用 1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection ...

  4. Guava学习

    Guava学习笔记目录 Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concu ...

  5. [置顶] Guava学习之ArrayListMultimap

    ArrayListMultimap类的继承关系如下图所示: Guava ArrayListMultimap List Multimap 是一个接口,继承自 Multimap 接口.ListMultim ...

  6. [置顶] Guava学习之Splitter

    Splitter:在Guava官方的解释为:Extracts non-overlapping substrings from an input string, typically by recogni ...

  7. [置顶] Guava学习之Iterators

    Iterators类提供了返回Iterator类型的对象或者对Iterator类型对象操作的方法.除了特别的说明,Iterators类中所有的方法都在Iterables类中有相应的基于Iterable ...

  8. [置顶] Guava学习之Lists

    Lists类主要提供了对List类的子类构造以及操作的静态方法.在Lists类中支持构造ArrayList.LinkedList以及newCopyOnWriteArrayList对象的方法.其中提供了 ...

  9. [置顶] Guava学习之Immutable集合

    Immutable中文意思就是不可变.那为什么需要构建一个不可变的对象?原因有以下几点: 在并发程序中,使用Immutable既保证线程安全性,也大大增强了并发时的效率(跟并发锁方式相比).尤其当一个 ...

随机推荐

  1. react js 按条数 展开/折叠

    //2条const MAX_SHOW_NUM = 2; class HotDiscuss extends Component { static propTypes = { //验证 repliedCo ...

  2. java学习:Hibernate入门

    相对微软的linq-to-sql或EF框架而言,"Hibernate对于eclipse的集成开发“ 新手并不容易掌握,下面是新手上路的步骤: 一.准备工作: 1.先下载eclipse (官网 ...

  3. [原创] Linux下几种文件传输命令 sz rz sftp scp介绍

    Linux下几种文件传输命令 sz rz sftp scp介绍 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具.由于它是基于SSH的,会在传输过程中对用户的密码.数据等 ...

  4. Linux命令之tcpdump

    项目中常用到的抓包命令: 1. tcpdump -i eth0:1 udp poort 6015 -Xvv 2. tcpdump host 239.16.101.27 -Xvv 3. tcpdump ...

  5. SQLDMO知识总结

    SQLDMO(SQL Distributed Management Objects) 参考手册:http://technet.microsoft.com/en-us/library/aa312550( ...

  6. RF--换行

    引自:http://blog.csdn.net/lvtingting2007/article/details/42173991

  7. Java多线程之Lock的使用

    import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util ...

  8. java中对插入排序的理解以及实例

    一.基本思想 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入. 插入排序非常类似于整扑克牌. 在开始摸牌时,左手是空的,牌面朝下放在桌上.接着,一次从桌上摸起一张牌 ...

  9. String s ; 和 String s = null ; 和 String s = "" ; 的却别

    String s ;该语句表示只是声明了一个引用变量,但是并没有初始化引用,所以对变量s的任何操作(除了初始化赋值外) 都将引发异常. String s=null; 表示未申请任何内存资源,即此语句表 ...

  10. SpringMVC框架的基础知识;

    首先 在javaEE环境下,建立一个动态的web工程: 导入架包.... 建立一对多映射关系的封装类,这儿只写属性,getter和setter方法就不写了: 1: private String pro ...