1.资源的释放完全可以实现自动关闭,jdk1.7之后,对于有些资源类实现了AutoClosable接口可以实现自动释放资源;
2.对于输入输出流的定义在try中的()来定义
3.用法(自动释放输入输出流的资源)
package com.ydlclass.feature;
import org.junit.Test;
import java.io.*;
import java.util.Random;
public class IOTest {
String tarPath;
public String getTarPath() {
return tarPath;
}
public void setTarPath(String tarPath) {
this.tarPath = tarPath;
}
@Test
//正确的处理异常,并且对已经使用完毕的流资源关闭,释放系统的资源
public void testCopyFileAutoClosable(){
try(InputStream inputStream1 = new FileInputStream("E:\\CloudMusic\\MV\\焦迈奇 - 我的名字.mp4");
OutputStream outputStream1 = new FileOutputStream("E:\\CloudMusic\\MV\\new.mp4");)
{
if (new Random().nextInt(10) > 2){//随机值大于2时,由于抛出异常,之后的内容不会被执行;
//但是finally关键字之后的内容会接着执行,但是输入数输出流为null,所以可能会报出空指针异常的问题;
throw new IOException();
}
File file = new File("E:\\CloudMusic\\MV\\new.mp4");
if (!file.exists()) {
file.createNewFile();
}
long start = System.currentTimeMillis();
byte[] bytes = new byte[1024 * 1024];//将每次运货箱的大小提升;这样只需要进行比较少的i/o操作就可以完成;
// 如果还想优化新能,那么可以使用多线程;或者使用nio
int len;
while ((len = inputStream1.read(bytes)) != -1) {
outputStream1.write(bytes, 0, len);
}
long end = System.currentTimeMillis();
System.out.println("单字节搬运:" + (end - start));
//上面的io是通过一个字节一个字节的读取文件,即使是8m左右大小的文,耗时大概是60分钟,可见io的效率不高;
//简单的优化
} catch (IOException e){
e.printStackTrace();
}
}
}