A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 彭飞 于 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 中,结果依旧。


还请大家帮我看看错误在那里
贴上代码:
  1. /**
  2. 拷贝一个音频文件-通过字节流的缓冲区
  3. 模拟一个缓冲区,对音频文件的拷贝。
  4. */
  5. import java.io.*;
  6. class MoniCopyMp391
  7. {
  8.         public static void main(String[] args) throws IOException
  9.         {
  10.                 //为了看拷贝效率,对拷贝时间进行统计。
  11.                 long start = System.currentTimeMillis();
  12.                 copy_2();
  13.                 long end = System.currentTimeMillis();

  14.                 System.out.println(end-start+"毫秒");
  15.                 /*
  16.                 通过copy  使用模拟的读取缓冲区方法,我们发现拷贝了,但是居然没有数据!
  17.                 通过加入【1】我们发现:
  18.                 */
  19.         }
  20.         public static void copy_2()throws IOException{
  21.                
  22.                 MBufInStr bufis = new MBufInStr(new FileInputStream("E:\\1.mp3"));
  23.                 BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("E:\\11.mp3"));
  24.                 int by = 0;
  25.                 System.out.println("第一个字节:"+bufis.myRead());//【1】
  26.                
  27.                 while((by=bufis.myRead())!=-1){
  28.                         bufos.write(by);
  29.                 }
  30.                 bufos.close();
  31.                 bufis.mClose();
  32.                
  33.         }

  34. }
  35. //模拟 InputStream 字节读取流 只需要模拟覆盖父类2个方法即可。
  36. class MBufInStr{
  37.         private InputStream in;
  38.         private byte [] buf = new byte [1024*4];//自定义缓冲区的数组
  39.         private int pos=0,count=0;// 指针,计数器
  40.         
  41.         MBufInStr(InputStream in ){
  42.                 this.in = in ;
  43.         }
  44.         //0   
  45.         public int myRead()throws IOException{
  46.                
  47.                 if(count==0){
  48.                         count = in.read(buf);//1-0、读一个存一个到缓冲区数组中,并用计数器统计
  49.                         if(count<0){//4、如果个数小于0 也就是-1  也就是没有数据的时候。
  50.                                 return -1;
  51.                         }
  52.                         pos = 0;//1-1、初始化指针。
  53.                         byte b = buf[pos];//1-2、创建 char b接收指针指向数组中被存如的数据
  54.                         count--;//1-4、取出一个,就少减少一个。
  55.                         pos++;//1-5、而指针指向下一个,
  56.                         //1-3、返回这个b
  57.                         return b&255;
  58.                         //2、这个时数组中还有元素未被取出,当再次使用myRead()方法又会存入数据,所以加上一个if(count==0)条件。
  59.                 }
  60.                 else if(count>0){//3、不为0 就是有数据,那么就继续取出。
  61.                         byte b =buf[pos];
  62.                         count--;
  63.                         pos++;
  64.                         return b&0xff;
  65.                 }
  66.                 return -1;
  67.         }
  68.         //0    关闭方法
  69.         public void mClose()throws IOException{
  70.                 in.close();
  71.         }
  72. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

4 个回复

正序浏览
占缓关闭该问题,看看有木有同学能看出来。哈哈。
回复 使用道具 举报
问题已经解决。

刚刚看了底层源代码。

总算是知道为什马了。哇咔咔。   太无语了。尼玛。
回复 使用道具 举报
lzhuas 发表于 2014-5-25 12:41
经测试,没问题啊,在我电脑上可以复制成功啊,不知道你什么问题了。。。 ...

回来我重启了一下,还是如此。  挺奇怪了。。。。
回复 使用道具 举报
经测试,没问题啊,在我电脑上可以复制成功啊,不知道你什么问题了。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马