封装拷贝,释放资源
当学完工具类,对一些很多第三方封装的IO工具类就很清楚了
一
import java.io.*;
/**
* 1、封装拷贝
* 2、封装释放资源
*/
public class FileUtils {
public static void main(String[] args) {
//文件到文件
try {
InputStream is = new FileInputStream("abc.txt");
OutputStream os = new FileOutputStream("abc-copy.txt");
copy(is,os);
} catch (IOException e) {
e.printStackTrace();
}
//文件到字节数据
byte[] datas=null;
try {
// InputStream is = new FileInputStream("abc.txt");
//ByteArrayOutputStream os =new ByteArrayOutputStream();
InputStream is = new FileInputStream("p.png");
ByteArrayOutputStream os =new ByteArrayOutputStream();//自动维护
copy(is,os);
datas = os.toByteArray();
System.out.println(datas.length);
} catch (IOException e) {
e.printStackTrace();
}
//字节数组到文件
try {
InputStream is = new ByteArrayInputStream(datas);
OutputStream os = new FileOutputStream("p-copy.png");
copy(is,os);
}
catch(IOException e) {
e.printStackTrace();
}
}
/**
* 对接输入流和输出流
* @param is
* @param os
*/
//封装拷贝
public static void copy(InputStream is,OutputStream os){
try {
//3、操作:分段读取
byte[] flush = new byte[1024];
int len = -1;//接收长度
while((len = is.read(flush)) != -1){
os.write(flush, 0, len);//分段写出
}
os.flush();
} catch (IOException ex) {
ex.printStackTrace();
}finally{
//4、释放资源:分别关闭,先打开的后关闭
close(is,os);
}
}
/**
* 封装释放资源
* @param is
* @param os
*/
public static void close(InputStreamReader 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();
}
}
/**
* 释放资源
* @param ios
*/
//public static void close(Closeable io,Closeable ios){//使用可变参数
public static void close(Closeable... ios){//使用可变参数
for(Closeable io : ios){
try {
if(null!=io){
io.close();
}
} catch(IOException e) {
e.printStackTrace();
}
}
}
}
二
import java.io.*;
/**
* try ...with...resource
* @author 裴新
*
*/
public class FileUtils2 {
public static void main(String[] args) {
//文件到文件
try {
InputStream is = new FileInputStream("abc.txt");
OutputStream os = new FileOutputStream("abc-copy.txt");
copy(is,os);
} catch (IOException e) {
e.printStackTrace();
}
//文件到字节数组
byte[] datas = null;
try {
InputStream is = new FileInputStream("p.png");
ByteArrayOutputStream os = new ByteArrayOutputStream();
copy(is,os);
datas = os.toByteArray();
System.out.println(datas.length);
} catch (IOException e) {
e.printStackTrace();
}
//字节数组到文件
try {
InputStream is = new ByteArrayInputStream(datas);
OutputStream os = new FileOutputStream("p-copy.png");
copy(is,os);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 对接输入输出流
* try ...with...resource
* @param is
* @param os
*/
public static void copy(InputStream is,OutputStream os) {
try(is;os) {
//3、操作 (分段读取)
byte[] flush = new byte[1024]; //缓冲容器
int len = -1; //接收长度
while((len=is.read(flush))!=-1) {
os.write(flush,0,len); //分段写出
}
os.flush();
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}