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

可以很明显看出代码的精简。

上边说过,只要是实现AutoCloseableCloseable接口的的对象都可以使用该方式,看下上例子中的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));
}
}

原文来自:http://blog.csdn.net/ty_laurel/article/details/60348495

Java 7 使用TWR(Try-with-resources)完成文件copy的更多相关文章

  1. java(包括springboot)读取resources下文件方式

    1.使用项目内路径读取,该路径只在开发工具中显示,类似:src/main/resources/resource.properties.只能在开发工具中使用,部署之后无法读取.(不通用) File fi ...

  2. 调用android的getColor()方法出现 java.lang.NoSuchMethodError: android.content.res.Resources.getColor

    1.java.lang.NoSuchMethodError: android.content.res.Resources.getDrawable/getColor或者 java.lang.NoSuch ...

  3. java.lang.NoClassDefFoundError: org/eclipse/core/resources/IContainer

    启动eclipse报错:java.lang.NoClassDefFoundError: org/eclipse/core/resources/IContainer 解决办法: 删除以下文件.metad ...

  4. eclipse启动错误:java.lang.NoClassDefFoundError: org/eclipse/core/resources/IContainer

    转自:http://blog.csdn.net/niu_hao/article/details/9332521 eclipse启动时报错如下:java.lang.NoClassDefFoundErro ...

  5. Eclipse中建立Maven项目后,Java Resources资源文件下没有src/main/java文件夹

    当建立好一个Maven项目后,在Java Resources资源文件夹下没有看到src/main/java文件夹,然后手动去创建Source Folder时,提示该文件已存在,如图: 有一个解决办法: ...

  6. Spring Boot 获取 java resources 下文件

    Spring Boot 获取 java resources 下文件 Spring Boot 获取 resources 目录下的目录(例:获取 resources 目录下的 template 目录): ...

  7. Java项目读取resources资源文件路径那点事

    今天在Java程序中读取resources资源下的文件,由于对Java结构了解不透彻,遇到很多坑.正常在Java工程中读取某路径下的文件时,可以采用绝对路径和相对路径,绝对路径没什么好说的,相对路径, ...

  8. java基础十[包、Jar存档文件和部署](阅读Head First Java记录)

    将Java的class文件生成为可执行的Java应用程序.Java应用程序有三种:完全在本机执行的Jar(例如本机的GUI可执行程序):完全在服务器端远程执行的(例如浏览器来进行存取):介于两者之间的 ...

  9. 【Java基础】通过getResourceAsStream() 加载资源文件

    Class.getResourceAsStream(String path) path不以"/"开头时,默认是从当前类所在的包下面获取资源 path以"/"开头 ...

  10. JAVA使用Logback发送日志到控制台、文件、ELK的最简单用法

    一.简述 本文讲JAVA使用Logback发送日志到控制台.文件.ELK的最简单用法. 二.教程 1.新建pom.xml项目引入下列依赖: <dependencies> <!--Be ...

随机推荐

  1. kindle試玩

    Q:試玩感受如何? Pros 按這個版本,沒有燈,在光纖不好的時候看起來很累.但陽光好的時候看起來很爽 重量很輕,比手機邀請很多 看書很容易沉浸下去,這一點比收集好狠毒 Cons 網上說看pdf不大行 ...

  2. docker push到私有仓库

    1.登录 docker login http://xxxxx.com 2.登录私有hub创建项目 例如项目叫:abc-dev 2.给镜像打tag docker tag 2e25d8496557 xxx ...

  3. Python3 字典 setdefault() 方法

    Python 字典 setdefault() 函数和get() 方法类似, 如果键不存在于字典中,将会添加键并将值设为默认值. dict.setdefault(key, default=None) k ...

  4. 【python】如何将ipdb的python解释器路径切换至虚拟环境中

    背景: 利用virtualenv构建一个python3.5的虚拟环境,在该虚拟环境中使用ipdb调试程序,结果报错找不到某一个模块. 程序的所有依赖模块都已经成功安装在虚拟环境中. 在虚拟环境中,te ...

  5. Linux Bash Shell字符串分割substring等(转)

    原文https://blog.csdn.net/wuyinggui10000/article/details/52779364 脚本开发中遇到的问题是:原java中的字符串分割操作(substring ...

  6. 常量&字符编码

    day1 name='Nod Chen' name2=name print('My name is ',name,name2) name='Luna zhou' print(name,name2) _ ...

  7. Chrome默认搜索引擎被窜改

    折腾了几个安全软件之后,Chrome浏览器默认搜索引擎被窜改,且无法删除,提示“管理员安装”,另外在插件栏出现了一个unTabs的东西,也无法删除,“受政策保护之类的”.搜索后找到一篇文章“Unabl ...

  8. C语言 链表(Dev C++/分文件版)

    头文件:quechain.h struct Question { int _id; struct Question* pre; struct Question* next; }; void chain ...

  9. async+await一起使用

    /** get 请求 * @param {接口地址} url * @param {请求参数} params */ get(url,params){ return new Promise((resolv ...

  10. Python 快速排序 算法

    基本的快排算法,二分法 #!/usr/bin/env python # encoding: utf-8 l1=[1,4,2,6,3] def path_sort(l,start_index,end_i ...