java 7新特性-TWR(Try-with-resources)
今天在资料上练习文件拷贝程序时,遇到了java 7中的一个新特性TWR,可以减少实际中的部分代码书写,对其做以记录。
try-with-resources语句是声明了一个或多个资源的try语句块。在java中资源作为一个对象,在程序完成后必须关闭。try-with-resources语句确保每个资源在语句结束时关闭。只要是实现了java.lang.AutoCloseable的任何对象(包括实现java.lang.Closeable的所有对象)都可以使用该方式对资源进行关闭。
在java 7之前,一般在进行文件IO操作时都需要显式的进行文件流(也可以理解为资源)的close操作,无论是操作到文件流末尾还是发生异常。往往很简单的一个逻辑都要好几行的代码进行修饰,使得代码结构变的复杂。如下例子,不管try语句块正常结束还是发生异常,都可以使用finally语句块来确保资源被关闭:
- static String ReadFile(String file) throws IOException {
- BufferedReader br = new BufferedReader(new FileReader(file));
- try {
- return br.readLine();
- } finally {
- if (br != null)
- br.close();
- }
- }
对于以上语句块,改写为TWR时,如下:
- static String ReadFile(String file) throws IOException {
- try(BufferedReader br = new BufferedReader(new FileReader(file))) {
- return br.readLine();
- }
- }
可以很明显看出代码的精简。
上边说过,只要是实现了AutoCloseable和Closeable接口的的对象都可以使用该方式,看下上例子中的BufferedReader类的源码实现:
public class BufferedReader extends Reader {
其继承了Reader抽象类,继续往上查看Reader抽象类,确实实现了Closeable:
public abstract class Reader implements Readable, Closeable {
明白了TWR具体含义,实例运用下,实现文件拷贝实现,代码中采用了两种方式实现文件拷贝过程(普通方式和NIO方式),两者存在一些性能的差异,感兴趣的读者可以自己测试代码性能。
- package javaFile.copyfile;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.nio.ByteBuffer;
- import java.nio.channels.FileChannel;
- public final class CopyFile { //使用final定义工具类,不用实例化
- private CopyFile() { //若实例化,则报错
- throw new AssertionError();
- }
- public static void fileCopy(String source, String target) throws IOException {
- try(InputStream in = new FileInputStream(source)) {
- try(OutputStream out = new FileOutputStream(target)){
- byte[] buffer = new byte[4096];
- int bytesToRead;
- while((bytesToRead = in.read(buffer)) != -1) {
- out.write(buffer, 0, bytesToRead);
- }
- }
- }
- }
- public static void fileCopyNIO(String source, String target) throws IOException {
- try(FileInputStream in = new FileInputStream(source)) {
- try(FileOutputStream out = new FileOutputStream(target)) {
- FileChannel inChannel = in.getChannel();
- FileChannel outChannel = out.getChannel();
- ByteBuffer buffer = ByteBuffer.allocate(4096); //申请4096字节缓冲
- while(inChannel.read(buffer) != -1) {
- buffer.flip(); //反转此缓冲区,设置当前位置指针为0,read读文件后文件指针在缓冲区末尾,需要使用flip重置
- outChannel.write(buffer);
- buffer.clear(); //清空缓冲区
- }
- }
- }
- }
- public static void main(String[] args) throws IOException {
- //CopyFile copyfile = new CopyFile();
- long start = System.currentTimeMillis();
- CopyFile.fileCopyNIO("E:\\大数据.rar", "E:\\testtest");
- long end = System.currentTimeMillis();
- System.out.println("耗时:"+(end-start));
- }
java 7新特性-TWR(Try-with-resources)相关推荐
- 转载:java 7新特性-TWR(Try-with-resources)
原始链接:https://blog.csdn.net/ty_laurel/article/details/60348495 java 7新特性-TWR(Try-with-resources) 今天在资 ...
- Java 9 新特性概述
转载自 Java 9 新特性概述 Java 9 正式发布于 2017 年 9 月 21 日 .作为 Java8 之后 3 年半才发布的新版本,Java 9 带 来了很多重大的变化.其中最重要的改动是 ...
- IntelliJ IDEA 使用 Java 11新特性以及Java 8 以来的Java 11新特性介绍
文章目录 Java 11 安装 IDEA 设置 特性1:lambda表达式中允许使用var 特性2: String新增REPEAT 方法,方便拷贝字符串 特性3: 文件读写更方便:readString ...
- Java 11 新特性
2019独角兽企业重金招聘Python工程师标准>>> Java 11 新特性 转载于:https://my.oschina.net/u/3764794/blog/2993127
- stream distinct去重_再来看看Java的新特性——Stream流
半年前开始试着使用Java的新特性,给我印象最深的就是Stream流和Optional.其中Stream提高了看法效率,让代码看起来十分清爽. 为什么要使用流? 摘要中已经说明了,为了提高开发效率.流 ...
- 跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局
转载自 跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局 恭喜你们,马上就要学完Java8 Stream流的一整系列了,其实我相信Stream流对很多使用Java的同 ...
- 跟我学 Java 8 新特性之 Stream 流(六)收集
转载自 跟我学 Java 8 新特性之 Stream 流(六)收集 我们前面的五篇文章基本都是在说将一个集合转成一个流,然后对流进行操作,其实这种操作是最多的,但有时候我们也是需要从流中收集起一些 ...
- 跟我学 Java 8 新特性之 Stream 流基础体验
转载自 跟我学 Java 8 新特性之 Stream 流基础体验 Java8新增的功能中,要数lambda表达式和流API最为重要了.这篇文章主要介绍流API的基础,也是流API系列的第一篇文章, ...
- 跟我学 Java 8 新特性之 Stream 流(二)关键知识点
转载自 跟我学 Java 8 新特性之 Stream 流(二)关键知识点 我们的第一篇文章,主要是通过一个Demo,让大家体验了一下使用流API的那种酣畅淋漓的感觉.如果你没有实践,我还是再次呼吁 ...
最新文章
- Yii2 操作不同的数据库
- python菜鸟工具-终于清楚python菜鸟入门教程
- 工具包:Safetype Config使用
- C++类对象成员、动态对象、new、delete运算符申请动态空间(C++初学面向对象)
- go 基准测试 找不到函数_初学TDD:测试也能推动开发啦!
- java实现单例模式线程安全
- 数据库知识点总结归纳
- 萤石开放平台——如何对摄像头消息做二次开发
- 简单文本分割器V1.0发布(包括源码)
- pytorch中为Module和Tensor指定GPU
- 轻松玩转自动机器学习AutoML:H2O Flow
- Warning: mysqli::mysqli(): (HY000/2002): No connection could be made because the target machine acti
- 拖拽牛逼,轻松实现一个自由拖拽的组件
- 运行时栈帧结构是怎样的?
- 批量删除word中的换行符号
- 移动硬盘故障损坏照片怎么恢复
- (7)货币时间价值利率
- P1111 修复公路P1195 口袋的天空
- 6月5日 历史上的大事记
- Oracle SQL Trace、Tkprof和10046事件
热门文章
- 基于Unity3D 的Vuforia SDK开发基础教程
- Linux中GCC编译工具集中个软件的用途、gcc的简单编译以及ELF文件格式
- matlab 非线性拟合残差,多元非线性拟合求参数及残差分析
- iPad能装Android系统,我错了,原来iPad真的能装Windows和MacOS系统
- Kibana坐标地图example
- 编程语言c 难学吗,为什么有人说C ++是最难学的编程语言
- 【渝粤教育】国家开放大学2018年秋季 1046t金融学 参考试题
- 迄今见过最好的职业规划文章
- googletest 学习笔记
- mysql skip 1062_【20180205】MySQL 1032和1062跳过错误总结