经验问题
在用字节码缓冲流BufferedInputStream/BufferedOutStream复制视频文件时,程序陷入死循环,视频文件无限增大。
问题代码如下:
问题代码如下:
public void copyFileWithBuffered(String src,String dest){
BufferedInputStream bufferedInputStream = null;
BufferedOutputStream bufferedOutputStream = null;
try {
// ①造文件
File srcfile = new File(src);
File destfile = new File(dest);
// ②造流
// 1. 造节点流
FileInputStream fileInputStream = new FileInputStream(src);
FileOutputStream fileOutputStream = new FileOutputStream(dest);
// 2. 造缓冲流(包装节点流)
bufferedInputStream = new BufferedInputStream(fileInputStream);
bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
// ③复制
byte[] buffer = new byte[1024];
int len;
while ((len = bufferedInputStream.read())!=-1) {
bufferedOutputStream.write(buffer,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// ④资源关闭:顺序有要求,先关闭"外层流",再关闭内层流(穿脱衣服)
if (bufferedOutputStream != null) {
try {
bufferedOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedInputStream != null) {
try {
bufferedInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// fileOutputStream.close();// 内层流被外层流自动关闭
// fileInputStream.close();
}
}
@Test
public void testCopyWithBuffered(){
long start = System.currentTimeMillis();
String srcfile = "D:\\学习\\艾瑞\\教学frame\\1004\\1.redis安装和命令.wmv";
String destfile = "D:\\学习\\艾瑞\\教学frame\\1004\\1.redis安装和命令2.wmv";
copyFileWithBuffered(srcfile,destfile);
long end = System.currentTimeMillis();
System.out.println(end - start);
}
问题解决:
问题出现在复制文件关键代码部分,字节码输入缓冲流对象的read()方法中必须要放入字节数组,否则默认无限读。
while(-1!=(bufferedInputStream.read(buffer))){
bufferedOutput.write(buffer,0,len);
}