通过对文件的输入输出流进行操作实现对拷贝的方法封装和资源的释放封装
拷贝方法的封装
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("hu.png");
ByteArrayOutputStream os = new ByteArrayOutputStream();
copy(is, os);
datas = os.toByteArray();//toByteArray()作用是将缓冲区内容拷贝一份并返回
System.out.println(datas.length);
} catch (IOException e) {
e.printStackTrace();
}
//字节数组到文件
try {
InputStream is = new ByteArrayInputStream(datas);
OutputStream os = new FileOutputStream("pp.png");
copy(is, os);
close(is,os);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 对接输入输出流
* @param is
* @param os
* @throws IOException
*/
public static void copy(InputStream is,OutputStream os) throws IOException {
try {
byte[] flush = new byte[1024*10];
int len = -1;
if((len=is.read())!=-1)
{
os.write(flush,0,len);
}
os.flush();
}catch(Exception e) {
e.printStackTrace();
}finally{
if(null!=is) {
is.close();
}
if(null!=os) {
os.close();
}
}
}
##释放资源方法的封装
###方法1:固定参数不太方便不建议使用
public static void close(InputStream is,OutputStream os)
{
try {
if(null!=is) {
is.close();
}
if(null!=os) {
os.close();
}
}catch(IOException e) {
e.printStackTrace();
}
}
###方法2:通过可变参数释放资源
利用InputStream 和OutputStream都实现Closeable接口
public static void close(Closeable...ios) { //三个点表示为可变参数
for(Closeable io:ios)
{
if(null!=io)
{
try {
io.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
###方法3:利用JDK提供的方法:try…with…resource
直接将处理方法copy中的try…catch…改为try(is;os)…catch即将要释放的资源放在try后面就行
public static void copy(InputStream is,OutputStream os) throws IOException {
try(is;os) {
byte[] flush = new byte[1024*10];
int len = -1;
if((len=is.read())!=-1)
{
os.write(flush,0,len);
}
os.flush();
}catch(Exception e) {
e.printStackTrace();
}finally{
if(null!=is) {
is.close();
}
if(null!=os) {
os.close();
}
}
}