zoukankan      html  css  js  c++  java
  • 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。然后我们断言,我们原始文件

    的字节编码与目标文件转换成的字符串一致。

  • 相关阅读:
    [AGC001F] Wide Swap
    [SCOI2016]幸运数字
    [POI2014]HOTHotels 加强版
    [JSOI2008]球形空间产生器
    JZOJ 3167.查税
    0linux简介
    vmware15pro安装ubuntu18.10时出现显示不全问题
    02目录
    linux系统的基础优化
    1安装操作系统
  • 原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/6236799.html
Copyright © 2011-2022 走看看