数据的拷贝和流的资源释放作为使用频率极高的两个过程,将其封装以便于使用。
Closeable:
InputStream和OutputStream共有的接口,可用于高效地实现对流的封装。
package SAMPLE.IO流;
import java.io.*;
/*
1、封装拷贝。
2、封装释放资源
*/
public class FileUtils {
public static void main(String[] args) {
//文件到文件的拷贝:
try {
InputStream is = new FileInputStream("aaa.txt");
OutputStream os = new FileOutputStream("bbb.txt",false);
copy(is,os);//引用封装
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//文件-->字节数组-->文件的拷贝
//文件-->字节数组:
byte[] datas = null;
try {
InputStream is = new FileInputStream("justice.jpg");
ByteArrayOutputStream os = new ByteArrayOutputStream();
copy(is,os);//引用封装
datas = os.toByteArray();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//字节数组-->文件:
try {
ByteArrayInputStream is = new ByteArrayInputStream(datas);
OutputStream os = new FileOutputStream("justice-copy.jpg");
copy(is,os);//引用封装
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
/*
封装--流与流对接实现文件拷贝
*/
public static void copy(InputStream is,OutputStream os) {
try{
int len = -1;
byte[] flush = new byte[1024];
while ((len = is.read(flush)) != -1) {
os.write(flush, 0, len);
}
os.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
close(is,os);
}
}
/*
封装--释放资源
*/
public static void close(InputStream is,OutputStream os){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/*
封装--释放资源--高效率
InputStream、OutputStream类都有Closeable接口
*/
public static void close(Closeable... io){//实现任意个流的释放
for(Closeable i:io){
if (i!= null) {
try {
i.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//使用泛型
public static <T extends Closeable> void closeAll(T ... io){
for(Closeable temp:io){
try {
if (null != temp) {
temp.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Try...with...resource:
JDk1.7出现的便捷释放资源方法。通过在try后扩入try下所有流的声明,则结束后自动释放流的资源。
try(InputStream is = new FileInputStream(src);
OutputStream os = new FileOutputStream(dest,true);) {
int len =-1;
byte[] flush = new byte[1024];
while((len=is.read(flush))!=-1){
os.write(flush,0,len);
}
os.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}