一.代码
package org.example;
import java.io.*;
public class day05 {
public static void main(String[] args) throws IOException {
//复制图片
//创建字节输入流管道与源文件接通
final FileInputStream is = new FileInputStream("D:\\temp\\day05\\图2.jpg");
//创建字节输出流管道与目标文件接通
final FileOutputStream os = new FileOutputStream("D:\\temp\\day05\\tu.jpg");
//创建字节数组,转移字节数据
final byte[] buffer = new byte[1024];
//从字节输入流读取字节数据,读多少写多少
int len;
while((len = is.read(buffer)) != -1){
os.write(buffer,0,len);
}
os.close();
is.close();
}
}
二.优化
package org.example;
import java.io.*;
public class day05 {
public static void main(String[] args) throws IOException {
try(
InputStream is = new FileInputStream("D:\\temp\\day05\\图2.jpg");
//创建字节输出流管道与目标文件接通
OutputStream os = new FileOutputStream("D:\\temp\\day05\\tu1.jpg");
) {
//复制图片
//创建字节输入流管道与源文件接通
//创建字节数组,转移字节数据
final byte[] buffer = new byte[1024];
//从字节输入流读取字节数据,读多少写多少
int len;
while((len = is.read(buffer)) != -1){
os.write(buffer,0,len);
}
}catch (IOException e){
e.printStackTrace();
}
}
}
以上代码没有使用try-catch-finally释放资源
而是采用try-with-resource方式
优点:该资源使用完毕后,会自动调用其close()方法,完成对资源的释放!
我们看下底层代码
三.测试
这里测试一下是否是自动调用close()
1.代码
package org.example;
import java.io.*;
public class day05 {
public static void main(String[] args) throws IOException {
try(
InputStream is = new FileInputStream("D:\\temp\\day05\\图2.jpg");
//创建字节输出流管道与目标文件接通
OutputStream os = new FileOutputStream("D:\\temp\\day05\\tu2.jpg");
//资源都是会实现AutoCloseable接口,资源都会有一个close()方法,并且资源都放在这里
//用完后,会自动调用close()方法,完成资源释放
Mycon mycon = new Mycon()
) {
final byte[] buffer = new byte[1024];
//从字节输入流读取字节数据,读多少写多少
int len;
while((len = is.read(buffer)) != -1){
os.write(buffer,0,len);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
package org.example;
public class Mycon implements AutoCloseable{
@Override
public void close() throws Exception {
System.out.println("在这里释放资源");
}
}