本帖最后由 彭飞 于 2014-5-27 08:36 编辑
今天看毕老师的视频【IO-19天-】【自定义字节流的缓冲区-read和write的特点】
其实就是 模拟一个 BufferInputoutStream 增强缓冲流
这个功能不算难,代码很快就敲完了,然后出现老师演示的情况
出现拷贝0字节的文件。然后我也写了一句输出语句
System.out.println("第一个字节:"+bufis.myRead());//【1】
没返回 -1 而是 0 或者 返回 73
然后又加上了return b&255; 和 return b&0xff; 语句,并把数组*4
研究了好久
始终是这个问题,我尝试了,MP3,mov, 都是如此。
很纳闷!!
并且反复对照代码,没有错误。
最后又将代码放到Myeclipse 中,结果依旧。
还请大家帮我看看错误在那里
贴上代码:
- /**
- 拷贝一个音频文件-通过字节流的缓冲区
- 模拟一个缓冲区,对音频文件的拷贝。
- */
- import java.io.*;
- class MoniCopyMp391
- {
- public static void main(String[] args) throws IOException
- {
- //为了看拷贝效率,对拷贝时间进行统计。
- long start = System.currentTimeMillis();
- copy_2();
- long end = System.currentTimeMillis();
- System.out.println(end-start+"毫秒");
- /*
- 通过copy 使用模拟的读取缓冲区方法,我们发现拷贝了,但是居然没有数据!
- 通过加入【1】我们发现:
- */
- }
- public static void copy_2()throws IOException{
-
- MBufInStr bufis = new MBufInStr(new FileInputStream("E:\\1.mp3"));
- BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("E:\\11.mp3"));
- int by = 0;
- System.out.println("第一个字节:"+bufis.myRead());//【1】
-
- while((by=bufis.myRead())!=-1){
- bufos.write(by);
- }
- bufos.close();
- bufis.mClose();
-
- }
- }
- //模拟 InputStream 字节读取流 只需要模拟覆盖父类2个方法即可。
- class MBufInStr{
- private InputStream in;
- private byte [] buf = new byte [1024*4];//自定义缓冲区的数组
- private int pos=0,count=0;// 指针,计数器
-
- MBufInStr(InputStream in ){
- this.in = in ;
- }
- //0
- public int myRead()throws IOException{
-
- if(count==0){
- count = in.read(buf);//1-0、读一个存一个到缓冲区数组中,并用计数器统计
- if(count<0){//4、如果个数小于0 也就是-1 也就是没有数据的时候。
- return -1;
- }
- pos = 0;//1-1、初始化指针。
- byte b = buf[pos];//1-2、创建 char b接收指针指向数组中被存如的数据
- count--;//1-4、取出一个,就少减少一个。
- pos++;//1-5、而指针指向下一个,
- //1-3、返回这个b
- return b&255;
- //2、这个时数组中还有元素未被取出,当再次使用myRead()方法又会存入数据,所以加上一个if(count==0)条件。
- }
- else if(count>0){//3、不为0 就是有数据,那么就继续取出。
- byte b =buf[pos];
- count--;
- pos++;
- return b&0xff;
- }
- return -1;
- }
- //0 关闭方法
- public void mClose()throws IOException{
- in.close();
- }
- }
复制代码
|