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));

 

SRAM compiler选项中 Soft Error Repair (SER) 引起的瞬时故障,可能会影响 SRAM 中存储的数据。SER 功能通过某种机制检测并修复这些错误,从而提高存储器的可靠性。在 SRAM 编译器中, 阅读详情

相关推荐

基于轻量级神经网络MobileNet V2的水果识别种类算法研究

本文阐述了一种基于轻量级卷积神经网络MobileNet V2的水果分类与识别算法研究。为了最大限度地促进机械收获,需要一个检测系统,它可以让我们识别不同类别的水果。一个相对未开发的想法是使用深度学习和人工智能算法,不仅可以检测水果的种类,还可以检测水果是否成熟。这可以证明是有利可图的,因为它可以提供作物生长状况以及成熟和未成熟果实的个体数量,以及决定是否是收获时间的有用信息。第一步对数据进行了预处理,数据预处理技术在众多的深度学习计算中起到了重要作用。

qq_43556680的博客 1640

java多线程压缩一个文件夹,java - 使用Java ParallelScatterZipCreator快速压缩文件夹 - 堆栈内存溢出...

或初始化InputStreamSupplier的值是什么? 我试图将所有文件压缩到一个目录中,这应该很快。 所以多线程是我要的选择。public class ScatterSample {ParallelScatterZipCreator scatterZipCreator = new ParallelScatterZipCreator();ScatterZipOutputStream dir...

weixin_39997400的博客 2015

halcon与c#联合编程实现相机控制+图像平移缩放+日志记录+缺陷检测+路径规划

halcon与c#联合编程实现相机控制+图像平移缩放+日志记录+缺陷检测+路径规划 前言 本人近期在工作中遇到需要对某场景下利用海康相机进行图像缺陷检测与对应路径规划。通过对海康相机示例代码进行吸收与借鉴,最终实现了对海康相机的控制,并增加HSmartWindowControl控件,实现图像的实时显示与平移缩放功能;通过listview+toolstrip实现日志显示与类型(提示、警告、错误)分类;同时自行编制算法实现对缺陷的识别以及缺陷外扩矩形范围内的路径规划。 1.日志记录 代码如下(示例):

weixin_37864926的博客 2717

关于Guava中I/O中的ByteCharStreams的各个方法解读

2.1 newInputStreamSupplier(byte[ public static InputSuppliernewInputStreamSupplier(byte[] b) 该方法将输入的byte数组做成一个含有ByteArrayInputStream的工厂返回。 2.2 newInputStreamSupplier(Byte[], int, int) public stati

Husc2009的专栏 2215

知识图谱_知识图谱 | 知识图谱做用户画像

导读:最近一直在思考怎么用知识图谱做推荐,但是目前能知道的内容都是基于路径的推荐和基于图特征的推荐,所以能不能换一个角度,探究一下用知识图谱怎么做用户画像,因为画像也是推荐系统重要的一部分。现在的知识图谱+推荐怎么做的传统的用户画像怎么做现在的知识图谱+推荐怎么做的?基于路径:可以理解成基于图谱的多路径召回,或者多路径推荐,然后根据路径的转移概率进行排序从而达到推荐的效果,基于路径比较适合简单的推...

weixin_28801659的博客 1460

开源PACS系统Orthanc(DICOM服务器)配置

PACS(Picture Archiving and Communication System)是医学影像的数字化存储、检索和传输系统,用于管理和存储医学图像和相关信息,如放射学、核医学、超声、病理学等各种医学影像。PACS系统通过数字化技术取代了传统的胶片方式,使医疗机构能够更高效地存储、传输和查看医学图像,从而提高了医疗图像的管理和工作流程。

qq_42231043的博客 6250

使用 Java 多线程进行文件压缩

Java 多线程进行文件压缩

ChinaLiaoTian的博客 2413

nRF52382低功耗蓝牙应用开发之入门教程-软件烧录

准备工作在上一篇文章讲过了,这里就讲讲nRFgo studio的使用 硬件准备: J-link:2线 供电:3.3V 如下图打开nRFgo studio界面介绍, 2、如果J-link正常,如下图 3、如果蓝牙芯片正常 4、烧录过程,如果蓝牙芯片之前有烧录过程序,需先点擦除,再点烧录 5、烧录代码路劲,例如 F:\nRF\SDK\nRF5_SDK_15.2.0_...

LinQiPing233的博客 1945

java 多线程 压缩,zip-archive

import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;import org.apache.commons.compress.parallel.InputStreamSupplier...

weixin_33785828的博客 1071

Vivado加上VsCode让你的生活更美好

VsCode与Vivado的灵活使用 引言 ​ 现在大二了,在接触硬件描述语言。Vivado自带的编辑器实在很难用,为了能够“极客”一些,当然是去Google了一下有哪些方法可以取而代之。 ​ 网络上的答案大同小异,基本上都是用的Sublime Text.(我的学长们也几乎都是) 平时码代码的过程中,我习惯与使用VsCode,尤其是在微软收购GitHub之后,Code 简直就是神器了。于是乎…一个...

qq_39498701的博客 10万+

从CMT2300A实战出发:Sub1G射频匹配电路设计要点与315MHz应用详解

本文从CMT2300A芯片实战出发,详细解析Sub1G射频匹配电路设计要点,特别针对315MHz应用场景。内容涵盖频段划分逻辑、调制方式选择、晶体振荡器设计等基础认知,以及315MHz匹配电路物料选型、巴伦网络处理等实战技巧,并分享PCB布局防干扰设计和实测验证方法,助力开发者优化射频通信性能。

weixin_29238147的博客 164

java 多线程压缩文件生成zip

java 多线程压缩文件生成zip

a10851_1的博客 2153

XCP实战系列介绍09-基于Vehicle Spy进行XCP测量步骤详解

详细介绍如何使用Vehicle Spy进行XCP测量

initiallizer的博客 1393

Google的Guava之IO升华

程序猿在开发过程中,使用文件的几率是相当大的,有时候,我们甚至需要几十秒内读取一下IO流中的数据,但是原生态的文件流的读写,一旦操作不当,就有可能出现内存溢出和打开文件数过多的异常错误,这一点在Linux环境下表现得尤其突出,所以使用好原生态的读写文件流真的很重要!好啦,这里着重来讲一下Google的Guava对IO的操作升级,上一篇讲的Guava对Collection的优化,魅力之处尽在不言中了

Joyce Luo的专栏 2万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

掌握Guava的IO操作工具:让你的文件处理更简单、高效

Guava是一个Google开发的Java库,其中包含了大量实用的工具类,其中就包括IO操作工具类。这些IO操作工具类可以极大地简化Java IO编程,提高代码的可读性和可维护性。通过使用这些工具类,我们可以更加方便地进行文件处理、流处理和资源访问等操作。

凡夫编程 1715

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【Guava】IO工具

其次,它还提供了更丰富的功能,比如对不同字符集的处理,还有资源的高效管理。在Java中,流(Streams)是处理数据的核心,不论是文件I/O还是网络通信,流都扮演着至关重要的角色。传统的Java I/O操作,虽然功能强大,但代码写起来往往既长又复杂,但是,有了Guava,这一切都变得轻松多了。在传统的Java I/O中,写文件也是一大堆代码,需要处理流的打开和关闭,还得小心处理异常。两个概念,指可以从中打开流的资源,比如 File、URL,同样也分别有字节和字符对应的源和汇,定义了一系列读写的方法。

SevenCoding的博客 785

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Guava IO

package guavaIO; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.io.Files; import static c...

chugaiceng3557的博客 198

Guava - IO

除了java之外的其他几种jvm语言,例如kotlin,groovy,scala,在自带的库里,已经对文件以及io操作有了非常大的增强,而相比之下java的一些io方法相当原始,所以我们只能求助于类库。虽然自己写一些工具类并不费什么事,但是guava提供的io方法不仅效率高,而且抽象度也高,所以非常易学。 Files files是一个工具类,估计很多人都写过类似的,但是guava是一个被无数人使用...

冬ji陽光 370

guava快速入门

Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。guava类似Apa

dgeek的博客 6万+

Google Guava IO 操作

       关于IO操作Guava给我们提供了很多工具类,大大提高了我们开发效率.下面我们将对Guava IO 提供的相关工具类做一个简单的介绍.涉及到的工具类主要有:ByteStreams,CharStreams,Resources,Closeables,Flushables,Files,MoreFiles. 一 ByteStreams   &...

旧路 2183

Guava API 的使用笔记

汪文君Guava视频教程 练习源码 google-guava 文章目录Guava UtilitiesJoinerSplitterPreconditionsOthersGuava FunctionalFunction/FunctionsPredicate / PredicatesSupplier / SuppliersStopwatch计时器和JDK的ServiceLoaderGuava IOFiles工具类CharSource/CharSink 字符流ByteSource/ByteSink 字节流Char

吃西瓜不吐葡萄皮 2091

Java文件流操作 - 【Guava】IO工具

Java文件流操作 - 【Guava】IO工具

weixin_46619605的博客 1138
上一篇: guava笔记7-Networking
下一篇: guava笔记11-Hashing
leadtoit
博客等级 码龄17年 2粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值