黑马程序员 之 IO流 拷贝视频
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
关于音频和视频的拷贝,自定义了一个字节缓冲区!
思路:一般对于IO流而言:
1 确定 源
2 确定 目的地
3 进行 数据的读写(一般用循环读取!)
4 关闭 资源
对于一般的文件,因为是字符码,在循环读取的时候,可以定义一个缓冲数组,这样可以加快读取的效率;
例如: char[] buf = new char[1024];
int num = 0;
while((num=fi.read(buf))!=-1)
{
System.out.println(new String(buf,0,num));
}
package stu.love.outputstream;
import java.io.*;
/*
* 自定义 字节流的 缓冲区
*
* */
// 输入流的 字节流缓冲区
class MyBufferedInputStream
{
private InputStream in;
// 定义 缓冲数组
private byte[] buf = new byte[1024];
// 定义指针
private int pos=0;
// 定义计数器
private int count=0;
MyBufferedInputStream(InputStream in)
{
this.in = in;
}
// 一次 读取 一个字节! 从缓冲区 获取!
public int myRead() throws IOException
{
// 当 缓冲区 的数据 取尽 之后 在 重新装入!
if(count==0)
{
// 1 通过 in 对象,读取 硬盘中的数据 存放到buf 中!
count = in.read(buf);
//退出 条件! 读取到文件的最后 要 退出条件!
if(count<0)
return -1;
//读取之后 指针置零!
pos = 0;
// 获取第一个数据
byte b = buf[pos];
// 计数器 递减
count--;
// 指针递增! 读取下一个字节!
pos++;
return b&255;
}
else if(count >0)
{
// 获取下一个数据
byte b = buf[pos];
// 计数器 递减
count--;
// 指针递增! 读取下一个字节!
pos++;
return b&0xff;
}
return -1;
}
// 关闭!
public void myClose() throws IOException
{
in.close();
}
}
// 输出流的字节流缓冲区
class MyBufferedOutputStream
{
}
public class MyBufferedStream {
/**
* @param args
*/
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
long start = System.currentTimeMillis();
copy_2();
long end = System.currentTimeMillis();
System.out.println("花费时间="+(end-start)+"毫秒");
}
// 1 使用字节流缓冲区 完成复制!
public static void copy_2() throws IOException
{
// 1 源
MyBufferedInputStream bufi = new MyBufferedInputStream(new FileInputStream("Dance.mp4"));
// 2 目的
BufferedOutputStream bufo = new BufferedOutputStream(new FileOutputStream("Dance_copy2.mp4"));
// 3 操作
int by = 0;
// 找到问题的原因?
// System.out.println("第一个字节:"+bufi.myRead());
//直接进行 流的操作!
// 读取 和 写入 同时 进行啊!
while((by=bufi.myRead())!=-1)
{
bufo.write(by);
}
// 4 关闭
bufi.myClose();
bufo.close();
}
}