1.文件 — 文件
2.文件 — 字节数组
3.字节数组 — 文件
1)将操作步骤封装起来,封装起来的无非就是操作步骤,仿佛就像一个管道,将输入输出流连接起来。在使用时只需传入相应的输入、输出流即可。
2)释放也将其封装起来,下面介绍了三种释放方法。
第二种释放方法:无论是输入流,还是输出流,都继承了一个Closeable接口,所以直接使用即可。有几个要传你就写几个,我下面的例子是使用的可变参数(避免传入过多),你传几个进来都可以。
第三种释放方法:直接在操作的try后面写上就可以,使用分号隔开。
package cn.rou.io;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 1.文件-->文件
* 2.文件-->字节数组
* 3.字节数组-->文件
*
* 封装拷贝
* 封装释放
*
* @author : RouBao
*
*
*/
public class FileUtils {
public static void main(String[] args) {
// 文件到文件
try {
FileInputStream is = new FileInputStream("abc.txt");
FileOutputStream os = new FileOutputStream("abc-copy.txt");
copy(is, os);
} catch (IOException e) {
e.printStackTrace();
}
// 文件到字节数组
byte[] datas = null;
try {
FileInputStream is = new FileInputStream("DRB.jpg");
ByteArrayOutputStream os = new ByteArrayOutputStream();
copy(is, os);
datas = os.toByteArray();
System.out.println(datas.length);
} catch (IOException e) {
e.printStackTrace();
}
// 字节数组到文件
try {
ByteArrayInputStream is = new ByteArrayInputStream(datas);
FileOutputStream os = new FileOutputStream("DRB-copy.jpg");
copy(is, os);
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* 对接输入输出流 第三种方法 释放:try...with...resource
*
*/
public static void copy(InputStream is, OutputStream os) {
try (is; os) {
// 操作
// 分段读取数据
byte[] by = new byte[1024];
int len = -1;
while ((len = is.read(by)) != -1) {
// 将读取的字节数组直接写入目的文件
os.write(by, 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 {
if (os != null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 第二种方法 释放
public static void close(Closeable... ios) {
for (Closeable io : ios) {
try {
if (io != null) {
io.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}