`
leadtoit
  • 浏览: 63067 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

guava笔记10-IO

 
阅读更多

Java中使用IO Stream直接操作文件的,但是当我们使用这些的时候,往往要经过很多步骤,比如打开文件,关闭文件。很多时候,我们会记得打开文件,但是最后还是一个close()过程,我们总是容易忽略。

 

一.文件操作Util类

Guava建议我们定义所有的IO实体时都使用InputSupplier和OutputSupplier进行包装,这样,我们就不用考虑那么多事情了,简化了操作。

我们知道java IO包里面将文件流分为字节流(InputStream or OutputStream)和字符流(Reader or Writer),guava里面的ByteStreams and CharStreams分别提供了util方法,用来对字节流和字符流进行处理。主要包含的方法如下:

 

 

 

此外,Files类提供了很多static的方法来对文件进行操作,其中有2个方法可以把文件使用InputSupplier或者OutputSupplier进行封装,使用封装后的对象就不会忘记关闭文件了。

 

static InputSupplier<T>  newInputStreamSupplier(File) 可以将file对象使用InputSupplier进行封装。

static OutputSupplier<T> newOutputStream(File) 可以将file对象使用OutputSupplier进行封装。

 

其实Files功能和ByteStreams and CharStreams差不多,其他的重要方法包括,:

toString():读取文件内容

copy():文件内容拷贝,包含多种参数形式

move():文件移到,可以重命名

getFileExtension():获取文件后缀名

getNameWithoutExtension():返回不含后缀的文件名

readLines(File, Charset, LineProcessor):每读取一行就交给LineProcessor进行处理

map(File):把文件映射到内存区块,返回java.nio. MappedByteBuffer

createParentDir(File):如果父目录不存在,则创建之。

simplifyPath(String):把路径格式化

 

二.关闭文件

在JDK7以前,对文件操作,我们需要时刻注意用完后关闭文件。

InputStream in = null;

try {

  in = openInputStream();

  OutputStream out = null;

  try {

    out = openOutputStream();

    // do something with in and out

  } finally {

    if (out != null) {

      out.close();

    }

  }

} finally {

  if (in != null) {

    in.close();

  }

}

可以看到,这段代码真是太复杂了,一不小心就出错了。

可喜的是JDK7有了新的措施来解决这类问题,那就是try-with-resources 语句,如:

try (

        java.util.zip.ZipFile zf =

             new java.util.zip.ZipFile(zipFileName);

        java.io.BufferedWriter writer = 

            java.nio.file.Files.newBufferedWriter(outputFilePath, charset)

    ) {

        // Enumerate each entry

        for (java.util.Enumeration entries =

                                zf.entries(); entries.hasMoreElements();) {

            // Get the entry name and write it to the output file

            String newLine = System.getProperty("line.separator");

            String zipEntryName =

                 ((java.util.zip.ZipEntry)entries.nextElement()).getName() +

                 newLine;

            writer.write(zipEntryName, 0, zipEntryName.length());

        }

    }

基本语法是:try(…) {} ,try里面所有实现接口java.lang.AutoCloseable,包括java.io.Closeable的对象,在{}的语句块执行完毕后都会自动的close。

 

那JDK7以前的版本怎么办呢,guava给我们提供了方法。我们可以把Closeable 的对象注册到Closer对象上,资源使用完毕后,调用closer的close方法,就可以把所有注册了的资源安全的close掉。这个方法虽然没有try-with-resources好用,但是比起传统的jdk做法,要好很多了。

Closer closer = Closer.create();

try {

  InputStream in = closer.register(openInputStream());

  OutputStream out = closer.register(openOutputStream());

  // do stuff with in and out

} catch (Throwable e) { // must catch Throwable

  throw closer.rethrow(e);

} finally {

  closer.close();

}

 

三.Source和Sink

此外,guava还提供了Source和Sink来对文件流进行操作。

Files提供了方法,从File对象得到Source和Sink。

stati c  ByteSource  Files.asByteSource

static  CharSource  Files.asCharSource

static  ByteSink  Files.asByteSink

static  CharSink  Files.asCharSink

 

Source实现了InputSupplier,表示可读的输入流,但是跟InputSupplier不同,它是一个不可变化的supplier实例。

Source分为ByteSource 和CharSource,分别用来处理字节流和字符流。

Source提供了方法openStream() 返回一个新创建的输入流,可以使用这个流来读取文件内容,读取完毕后调用方要负责关闭掉。

此外,Source还提供了一些快捷操作的方法,如copyTo,调用这样的方法,操作完毕后会自动关闭文件,不用考虑手动关闭文件的问题。

 

与Source对应,Sink实现了OutputSupplier,表示可写的输出流,它也是一个不可变的supplier实例。

Sink也分为ByteSink和CharSink,分别用来处理字节流和字符流。

Sink也提供了方法openStream()返回一个新创建的输出流,可以使用这个流来写文件,完成后调用方要记得关闭掉流。

Sink里面有些快捷操作方法,如writeLines,writeFrom操作完成后也是会自动关闭文件的。

Source和Sink用起来还是很方便的,如下面一句话就可以实现文件复制了,完全不用考虑文件的关闭。

Files.asByteSource(new File("d:/1.txt")).copyTo(Files.asByteSink(new File("d:/2.txt"),FileWriteMode.APPEND));

 

  • 大小: 80.4 KB
分享到:
评论

相关推荐

    java校招学习笔记

    10. **源码阅读**:学习和理解一些开源项目的源码,如Apache Commons、Guava等。 这份"java校招学习笔记"应该是一个全面的参考资料,帮助求职者巩固Java知识,提高解决问题的能力,以应对面试中的各种挑战。同时,...

    Java-notes:Java 知识梳理和学习笔记,计算机网络,数据结构,设计模式等

    Guava Joda-time Log4j Java 8 容器 Tomcat 1、Java 语言基础和JDK源码阅读 Java 语言基础 编号 名称 1 基本 2 运算符 3 数据类型 4 类 对象 接口 5 数组 6 枚举 7 异常处理 8 注解 9 范型 其他 编号 名称 1 Object...

    java笔记fdsfdsfdsdf

    例如,“对手分布函数库”可能指的是在Java中使用不同的库(如Apache Commons或Guava)来处理数据分布或算法;“空间不能快速的纪念版”可能是指内存管理或性能优化问题;“上课了半年”暗示了作者正在进行长期的...

    leetcode中国-repos-plan.github.io:回购计划.github.io

    它旨在帮助开发者通过Markdown格式整理和分享他们的学习笔记,同时也涵盖了其他技术领域如Vue.js、Node.js、Android学习以及Guava库的常用解析。 【描述】该项目可能是正在进行中的工作,因为提到了"可能未完结",...

    Java-notes:Java语言笔记

    Java提供了java.io和java.nio包来处理二进制数据,如文件读写、网络流等。例如,FileInputStream和FileOutputStream用于基本的文件操作,DataInputStream和DataOutputStream则支持二进制数据的读写。同时,BitSet类...

    Java 笔试面试下载

    10. **工具类与库**:例如Apache Commons、Guava等,以及JUnit测试框架,Maven或Gradle构建工具等。 这些知识点是Java开发者必备的基础技能,熟练掌握并能够灵活运用,将有助于在笔试和面试中脱颖而出。对于每个...

    高级java笔试题-itresource:程序开发技术资源集合

    收藏——IO模型的4张经典图例(一看就懂) ] () java技术系列文章 [ java swing 界面统一设置字体样式 ] () [ Google Java 编程风格指南 ] () [ Quartz应用与集群原理分析 ] () [ heavyz的Tomcat学习笔记(包括启动流程...

    安卓java读取网页源码-JavaAyo:java的学习和测试工程,纯java工程,直接运行main方法

    NIO,IO 注解 [笔记] dagger2: Retrofit和ButterKnife的注解怎么实现 反射 JOOR [ClassLoader==&gt;字节码,apk] Socket==&gt;openfire==&gt;netty 设计模式:都在源码里 更好的使用java: [Json] Gson: [xml==&gt;webservice] ...

    java8集合源码分析-Awesome-Java:真棒-Java

    笔记 Java 语言相关的API,第三方库和计算机基础理论等知识的学习和整理 更多 : | | 目录 资源 详细目录 Java语言和JDK源码 Java语言的基础理论知识 并发编程 Java并发编程相关的内容,并发包源码分析等 集合框架 ...

    Java开发技术大全.zip

    这个压缩包中可能包含了大量的教程、示例代码、笔记文档和其他相关材料,为初学者和经验丰富的开发者提供了丰富的学习资源。 1. **基础语法**:Java的基础语法是学习的起点,包括数据类型(如基本类型和引用类型)...

    Java夜未眠.zip

    Java语言的特点包括跨平台性(得益于"一次编写,到处运行"的JVM)、强大的库支持(如Apache Commons、Google Guava等)、以及丰富的生态系统(如Maven Central仓库)。在实际开发中,Java被广泛应用于Web应用、大...

    PubLearnNotes

    这些内容可能包括但不限于基础语法、面向对象编程概念、异常处理、集合框架、多线程、IO流、网络编程、数据库连接等Java核心知识点。此外,通过作者提供的CSDN博客和个人博客链接,读者可以找到更多更新和详细的信息...

Global site tag (gtag.js) - Google Analytics