10 IO流(七)——copy方法封装、关闭流方法封装的两种方式以及try...with...resource
前言
本文将上一节做的代码,对copy方法与关闭流方法进行封装,并使用try...with...resource关闭流。
copy方法封装
我们将copy方法封装,使得只需传入两个流,就能将输入流的源文件copy到输出流的目的文件。
值得注意的是,由于ByteArrayOutputStream不能直接写入文件,调用此方法后,数据保存在流中。
流关闭方法封装
方法一:原始方法
最原始的方法莫过于try...catch与close()结合
- public static void close(InputStream is,OutputStream os){
- try{
- if(null!=os){
- os.close();
- }
- }catch(IOException e){
- e.printStackTrace();
- }
- try{
- if(null!=is){
- is.close();
- }
- }catch(IOException e){
- e.printStackTrace();
- }
- }
方法二:多流关闭
使用方法的可变参数,通过遍历的方法,一个个关闭流。
- public static void close(Closeable...ios){
- for(Closeable io : ios){
- try{
- io.close();
- }catch(IOException e){
- e.printStackTrace();
- }
- }
- }
方法三:try...with...resource语法糖
在jdk1.7开始,就可以使用try...with...resource方法进行处理那些实现了Autocloseable的类或对象。它的格式是:
try(xxx cc = new xxx()){
}catch(...){...}
- public static void copy2(String filePath,String destPath){
- //操作流
- try(InputStream is = new FileInputStream(filePath);
- OutputStream os = new FileOutputStream(destPath)){//没有先后顺序
- byte[] flush = new byte[1024*10];//缓冲池
- int len = -1;//接收单次读取的长度
- while((len = is.read(flush))!=-1){//读取数据
- os.write(flush,0,len);//写入数据
- }
- os.flush();//刷新
- }catch(IOException e){
- e.printStackTrace();
- }//这里无需关闭方法
- }
写在try后的小括号中,如果有多个,用英文分号分隔。在括号中写完整的流声明,在执行完try后将自动关闭流。
在jdk1.9中进行了升级:可以不用xxx cc =new xxx()的方式,而是直接传入对象即可,格式为:
try(object1;object2...){..}catch(...){...}
同样可以传多个对象。需要注意的是,传入的对象必须被final修饰!
- public static void copy2(String srcPath,String destPath){
- //选择流
- FileInputStream fis =null;
- FileOutputStream fos = null;
- try{
- fis = new FileInputStream(srcPath);
- fos = new FileOutputStream(destPath);
- }catch(IOException e){
- e.printStackTrace();
- }
- final InputStream is = new BufferedInputStream(fis);//需要是final修饰才行
- final OutputStream os = new BufferedOutputStream(fos);
- //操作
- try(is;os){//看这里!语法糖!
- byte[] flush = new byte[1024];
- int len = -1;
- while((len = is.read(flush))!=-1){//读入
- os.write(flush,0,len);//写出
- os.flush();//刷新
- }
- }catch(IOException e){
- e.printStackTrace();
- }
- }
关于本文的完整练习代码
- import java.io.*;
- public class IOTest01
- {
- public static void main(String[] args)
- {
- //文件源
- String src = "1.rar";
- String dest = "1_cp.rar";
- //计算copy花费的时间
- long l1 = System.currentTimeMillis();
- copy2(src,dest);
- long l2 = System.currentTimeMillis();
- long time = l2-l1;
- System.out.println(time);
- }
- public static void copy(String srcPath,String destPath){
- //选择流
- //操作
- try(InputStream is = new BufferedInputStream(new FileInputStream(srcPath));
- OutputStream os = new BufferedOutputStream(new FileOutputStream(destPath))){
- byte[] flush = new byte[1024];
- int len = -1;
- while((len = is.read(flush))!=-1){//读入
- os.write(flush,0,len);//写出
- }
- os.flush();//刷新
- }catch(IOException e){
- e.printStackTrace();
- }
- }
- //下面是jdk1.9以后语法糖关闭流的使用
- public static void copy2(String srcPath,String destPath){
- //选择流
- FileInputStream fis =null;
- FileOutputStream fos = null;
- try{
- fis = new FileInputStream(srcPath);
- fos = new FileOutputStream(destPath);
- }catch(IOException e){
- e.printStackTrace();
- }
- final InputStream is = new BufferedInputStream(fis);//需要是final修饰才行
- final OutputStream os = new BufferedOutputStream(fos);
- //操作
- try(is;os){//看这里!语法糖!
- byte[] flush = new byte[1024];
- int len = -1;
- while((len = is.read(flush))!=-1){//读入
- os.write(flush,0,len);//写出
- os.flush();//刷新
- }
- }catch(IOException e){
- e.printStackTrace();
- }
- }
- }
10 IO流(七)——copy方法封装、关闭流方法封装的两种方式以及try...with...resource的更多相关文章
- LAMP(七)之编译安装php(模块化和fpm两种方式)
安装前说明: 安装环境: CentOS6 安装应用程序:httpd2.4 + mariadb + php 安装次序: 先编译安装 httpd2.4和mariadb,最后安装php 编译安装 httpd ...
- Linux 启动、关闭、重启服务的两种方式
1.一种是可以使用service脚本来调度,如: service 服务名 startservice 服务名 stopservice 服务名 restart 2.第二种可以直接进入/etc/init.d ...
- 实现Comet(服务器推送)的两种方式:长轮询和http流
Comet 是一种高级的Ajax技术,实现了服务器向页面实时推送数据的技术,应用场景有体育比赛比分和股票报价等. 实现Comet有两种方式:长轮询与http流 长轮询是短轮询的翻版,短轮询的方式是:页 ...
- 《连载 | 物联网框架ServerSuperIO教程》- 10.持续传输大块数据流的两种方式(如:文件)
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- IOS文件操作的两种方式:NSFileManager操作和流操作
1.常见的NSFileManager文件方法 -(NSData *)contentsAtPath:path //从一个文件读取数据 -(BOOL)createFileAtPath: path cont ...
- Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式
解析:Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式.面向字节的操作为以8位为单位对二进制的数据进行操作,对数据不进行转换,这些类都是InputStream和Out ...
- Day9 进程理论 开启进程的两种方式 多进程实现并发套接字 join方法 Process对象的其他属性或者方法 守护进程 操作系统介绍
操作系统简介(转自林海峰老师博客介绍) #一 操作系统的作用: 1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口 2:管理.调度进程,并且将多个进程对硬件的竞争变得有序 #二 多道技术: 1.产生背景: ...
- Docker镜像构建的两种方式(六)--技术流ken
镜像构建介绍 在什么情况下我们需要自己构建镜像那? (1)当我们找不到现有的镜像,比如自己开发的应用程序 (2)需要在镜像中加入特定的功能 docker构建镜像有两种方式:docker commit命 ...
- spring boot @ResponseBody转换JSON 时 Date 类型处理方法,Jackson和FastJson两种方式,springboot 2.0.9配置fastjson不生效官方解决办法
spring boot @ResponseBody转换JSON 时 Date 类型处理方法 ,这里一共有两种不同解析方式(Jackson和FastJson两种方式,springboot我用的1.x的版 ...
随机推荐
- c博客作业01--顺序分支结构
0.展示PTA总分 1.本章学习总结 1.1 学习内容总结 1.运算符需注意的要点 '/'的左右两边如果均为整型数,其结果也为整型:'%'的左右两边只能为整型数: 优先级:逻辑运算符<关系运算符 ...
- 表单提交 curl和浏览器方式
表单被提交时,每个表单域都会被Url编码之后才在被发送. 浏览器每次向服务器发送url时,会进行编码,然后web服务器再进行解码. 所以,理论上,curl模拟登陆时,所传参数都必须urlencode一 ...
- git sh.exe 乱码
其实很简单,只需要在 git 安装目录中的 etc 目录下修改 bash.bashrc 文件. 在该文件头部加入: export LANG=zh_CN.utf-8alias ls='ls --show ...
- mysql locate()函数
mysql> select * from test; +----+------------+-------+-----------+ | id | name | score | subject ...
- restframework之节流
基本思路(原生Django而言): 在django2.x中,若出现节流(访问频率控制)的需求,我们首先想到的是使用一个字典(dict类型)来存储所有IP地址的访问时间记录,这是针对于匿名用户(IP)而 ...
- EasyExcel写入百万级数据到多sheet---非注解方式
EasyExcel是什么? 快速.简单避免OOM的java处理Excel工具 一.项目需求 从mongo库中查询数据,导出到excel文件中.但是动态导出的excel有多少列.列名是什么.有多少she ...
- 刷题记录:[ASIS 2019]Unicorn shop
目录 刷题记录:[ASIS 2019]Unicorn shop 一.涉及知识点 1.Unicode安全问题 刷题记录:[ASIS 2019]Unicorn shop 题目复现链接:https://bu ...
- NoSql数据库Redis系列(5)——Redis主从复制
前面介绍Redis,我们都在一台服务器上进行操作的,也就是说读和写以及备份操作都是在一台Redis服务器上进行的,那么随着项目访问量的增加,对Redis服务器的操作也越加频繁,虽然Redis读写速度都 ...
- SSM项目的搭建
本文示例在如下环境下搭建一个Maven+Druid+SSM+Shiro+Mysql+PageHelper以及Mybatis Generator反向生成代码的项目 附上GitHub地址:https:// ...
- Redis系列 | Redis5.0 新特性