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