概念
1)IO概念:Java程序对数据的操作是通过“流”IO的方式,IO流用来处理设备间的数据传输(上传和下载文件)
2)流的概念:流是一组有顺序的、有起点有终点的集合(Byte),是对数据传输的一种抽象,它就是为了数据传输。
案例分析
使用不同的流方式实现视频的拷贝,并记录耗时,比较其性能,大小114Mb
代码如下
import java.io.*;
public class stream {
private static final String SRC_FILE = "E:\\9月.mp4";
private static final String DEST_FILE = "E:\\";
public static void main(String[] args) {
//copy01();//使用低级的字节流按照一个一个字节的形式复制文件
copy02();//使用低级的字节流按照一个一个字节数组的形式复制文件
copy03();//缓冲流一个一个字节复制
copy04();//缓冲流一个一个字节数组复制
}
/*
缓冲流一个一个字节数组复制
*/
private static void copy04() {
long startTime = System.currentTimeMillis();
try (
//把流放在这里最后可以不用释放资源,自动释放,相当于.close()方法
//1.创建低级的字节输入流与源文件接通
InputStream is = new FileInputStream(SRC_FILE);
//a.将低级的字节缓冲输入流包装成高级的字节数组缓冲输入流
InputStream bis = new BufferedInputStream(is);
//2.创建低级的字节输出流与源文件接通
OutputStream os = new FileOutputStream(DEST_FILE + "04.mp4");
//b.将低级的输出管道包装成高级的字节数组缓冲管道
OutputStream bos = new BufferedOutputStream(os);
){
//3.定义一个字节数组
byte[] buffer = new byte[1024];
int len;
while ((len = bis.read(buffer)) != -1){
bos.write(buffer,0,len);
}
}catch (Exception e){
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("使用高级的字节数组缓冲流按照一个一个字节数组的形式复制文件耗时:" + (endTime - startTime)/1000.0 + "s");
}
/*
缓冲流一个一个字节复制
*/
private static void copy03() {
long startTime = System.currentTimeMillis();
try ( //1.创建低级的字节输入流与源文件接通
InputStream is = new FileInputStream(SRC_FILE);
//a.把原始的低级字节输入流包装成高级的字节缓冲输入流
InputStream bis = new BufferedInputStream(is);
//2.创建低级的字节输出流与源文件接通
OutputStream os = new FileOutputStream(DEST_FILE + "03.mp4");
//a.把原始的低级字节输出流管道包装成高级的字节缓冲输出流管道
OutputStream bos = new BufferedOutputStream(os);
){
//3.定义一个字符常量记录每次读取的字节(一个一个的复制)—
int len;
while ((len = bis.read()) != -1){
bos.write(len);
}
}catch (Exception e){
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("使用高级的字节缓冲流按照一个一个字节数组的形式复制文件耗时:" + (endTime - startTime)/1000.0 + "s");
}
/*
使用低级的字节流按照一个一个字节数组的形式复制文件
*/
private static void copy02() {
long startTime = System.currentTimeMillis();
try ( //1.创建低级的字节输入流与源文件接通
InputStream is = new FileInputStream(SRC_FILE);
//2.创建低级的字节输出流与源文件接通
OutputStream os = new FileOutputStream(DEST_FILE + "02.mp4");
){
//3.定义一个字节数组
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1){
os.write(buffer,0,len);
}
}catch (Exception e){
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("使用低级的字节流按照一个一个字节数组的形式复制文件耗时:" + (endTime - startTime)/1000.0 + "s");
}
/*
使用低级的字节流按照一个一个字节的形式复制文件
*/
private static void copy01() {
//记录起始时间
long startTime = System.currentTimeMillis();
try ( //1.创建低级的字节输入流与源文件接通
InputStream is = new FileInputStream(SRC_FILE);
//2.创建低级的字节输出流与源文件接通
OutputStream os = new FileOutputStream(DEST_FILE + "01.mp4");
){
//3.定义一个字符常量记录每次读取的字节(一个一个的复制)—
int len;
while ((len = is.read()) != -1){
os.write(len);
}
}catch (Exception e){
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println("使用低级的字节流按照一个一个字节的形式复制文件耗时:" + (endTime - startTime)/1000.0 + "s");
}
}