今天在资料上练习文件拷贝程序时,遇到了java 7中的一个新特性TWR,可以减少实际中的部分代码书写,对其做以记录。

try-with-resources语句是声明了一个或多个资源的try语句块。在java中资源作为一个对象,在程序完成后必须关闭。try-with-resources语句确保每个资源在语句结束时关闭。只要是实现了java.lang.AutoCloseable的任何对象(包括实现java.lang.Closeable的所有对象)都可以使用该方式对资源进行关闭。

在java 7之前,一般在进行文件IO操作时都需要显式的进行文件流(也可以理解为资源)的close操作,无论是操作到文件流末尾还是发生异常。往往很简单的一个逻辑都要好几行的代码进行修饰,使得代码结构变的复杂。如下例子,不管try语句块正常结束还是发生异常,都可以使用finally语句块来确保资源被关闭:

  1. static String ReadFile(String file) throws IOException {
  2. BufferedReader br = new BufferedReader(new FileReader(file));
  3. try {
  4. return br.readLine();
  5. } finally {
  6. if (br != null)
  7. br.close();
  8. }
  9. }

对于以上语句块,改写为TWR时,如下:

  1. static String ReadFile(String file) throws IOException {
  2. try(BufferedReader br = new BufferedReader(new FileReader(file))) {
  3. return br.readLine();
  4. }
  5. }

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

上边说过,只要是实现了AutoCloseable和Closeable接口的的对象都可以使用该方式,看下上例子中的BufferedReader类的源码实现:

 public class BufferedReader extends Reader {

其继承了Reader抽象类,继续往上查看Reader抽象类,确实实现了Closeable:

 public abstract class Reader implements Readable, Closeable {

明白了TWR具体含义,实例运用下,实现文件拷贝实现,代码中采用了两种方式实现文件拷贝过程(普通方式和NIO方式),两者存在一些性能的差异,感兴趣的读者可以自己测试代码性能。

  1. package javaFile.copyfile;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. import java.nio.ByteBuffer;
  8. import java.nio.channels.FileChannel;
  9. public final class CopyFile { //使用final定义工具类,不用实例化
  10. private CopyFile() { //若实例化,则报错
  11. throw new AssertionError();
  12. }
  13. public static void fileCopy(String source, String target) throws IOException {
  14. try(InputStream in = new FileInputStream(source)) {
  15. try(OutputStream out = new FileOutputStream(target)){
  16. byte[] buffer = new byte[4096];
  17. int bytesToRead;
  18. while((bytesToRead = in.read(buffer)) != -1) {
  19. out.write(buffer, 0, bytesToRead);
  20. }
  21. }
  22. }
  23. }
  24. public static void fileCopyNIO(String source, String target) throws IOException {
  25. try(FileInputStream in = new FileInputStream(source)) {
  26. try(FileOutputStream out = new FileOutputStream(target)) {
  27. FileChannel inChannel = in.getChannel();
  28. FileChannel outChannel = out.getChannel();
  29. ByteBuffer buffer = ByteBuffer.allocate(4096); //申请4096字节缓冲
  30. while(inChannel.read(buffer) != -1) {
  31. buffer.flip(); //反转此缓冲区,设置当前位置指针为0,read读文件后文件指针在缓冲区末尾,需要使用flip重置
  32. outChannel.write(buffer);
  33. buffer.clear(); //清空缓冲区
  34. }
  35. }
  36. }
  37. }
  38. public static void main(String[] args) throws IOException {
  39. //CopyFile copyfile = new CopyFile();
  40. long start = System.currentTimeMillis();
  41. CopyFile.fileCopyNIO("E:\\大数据.rar", "E:\\testtest");
  42. long end = System.currentTimeMillis();
  43. System.out.println("耗时:"+(end-start));
  44. }

java 7新特性-TWR(Try-with-resources)相关推荐

  1. 转载:java 7新特性-TWR(Try-with-resources)

    原始链接:https://blog.csdn.net/ty_laurel/article/details/60348495 java 7新特性-TWR(Try-with-resources) 今天在资 ...

  2. Java 9 新特性概述

    转载自 Java 9 新特性概述 Java 9 正式发布于 2017 年 9 月 21 日 .作为 Java8 之后 3 年半才发布的新版本,Java 9 带 来了很多重大的变化.其中最重要的改动是 ...

  3. IntelliJ IDEA 使用 Java 11新特性以及Java 8 以来的Java 11新特性介绍

    文章目录 Java 11 安装 IDEA 设置 特性1:lambda表达式中允许使用var 特性2: String新增REPEAT 方法,方便拷贝字符串 特性3: 文件读写更方便:readString ...

  4. Java 11 新特性

    2019独角兽企业重金招聘Python工程师标准>>> Java 11 新特性 转载于:https://my.oschina.net/u/3764794/blog/2993127

  5. stream distinct去重_再来看看Java的新特性——Stream流

    半年前开始试着使用Java的新特性,给我印象最深的就是Stream流和Optional.其中Stream提高了看法效率,让代码看起来十分清爽. 为什么要使用流? 摘要中已经说明了,为了提高开发效率.流 ...

  6. 跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局

    转载自   跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局 恭喜你们,马上就要学完Java8 Stream流的一整系列了,其实我相信Stream流对很多使用Java的同 ...

  7. 跟我学 Java 8 新特性之 Stream 流(六)收集

    转载自   跟我学 Java 8 新特性之 Stream 流(六)收集 我们前面的五篇文章基本都是在说将一个集合转成一个流,然后对流进行操作,其实这种操作是最多的,但有时候我们也是需要从流中收集起一些 ...

  8. 跟我学 Java 8 新特性之 Stream 流基础体验

    转载自   跟我学 Java 8 新特性之 Stream 流基础体验 Java8新增的功能中,要数lambda表达式和流API最为重要了.这篇文章主要介绍流API的基础,也是流API系列的第一篇文章, ...

  9. 跟我学 Java 8 新特性之 Stream 流(二)关键知识点

    转载自   跟我学 Java 8 新特性之 Stream 流(二)关键知识点 我们的第一篇文章,主要是通过一个Demo,让大家体验了一下使用流API的那种酣畅淋漓的感觉.如果你没有实践,我还是再次呼吁 ...

最新文章

  1. Yii2 操作不同的数据库
  2. python菜鸟工具-终于清楚python菜鸟入门教程
  3. 工具包:Safetype Config使用
  4. C++类对象成员、动态对象、new、delete运算符申请动态空间(C++初学面向对象)
  5. go 基准测试 找不到函数_初学TDD:测试也能推动开发啦!
  6. java实现单例模式线程安全
  7. 数据库知识点总结归纳
  8. 萤石开放平台——如何对摄像头消息做二次开发
  9. 简单文本分割器V1.0发布(包括源码)
  10. pytorch中为Module和Tensor指定GPU
  11. 轻松玩转自动机器学习AutoML:H2O Flow
  12. Warning: mysqli::mysqli(): (HY000/2002): No connection could be made because the target machine acti
  13. 拖拽牛逼,轻松实现一个自由拖拽的组件
  14. 运行时栈帧结构是怎样的?
  15. 批量删除word中的换行符号
  16. 移动硬盘故障损坏照片怎么恢复
  17. (7)货币时间价值利率
  18. P1111 修复公路P1195 口袋的天空
  19. 6月5日 历史上的大事记
  20. Oracle SQL Trace、Tkprof和10046事件

热门文章

  1. 基于Unity3D 的Vuforia SDK开发基础教程
  2. Linux中GCC编译工具集中个软件的用途、gcc的简单编译以及ELF文件格式
  3. matlab 非线性拟合残差,多元非线性拟合求参数及残差分析
  4. iPad能装Android系统,我错了,原来iPad真的能装Windows和MacOS系统
  5. Kibana坐标地图example
  6. 编程语言c 难学吗,为什么有人说C ++是最难学的编程语言
  7. 【渝粤教育】国家开放大学2018年秋季 1046t金融学 参考试题
  8. 迄今见过最好的职业规划文章
  9. googletest 学习笔记
  10. mysql skip 1062_【20180205】MySQL 1032和1062跳过错误总结