根据BufferedInputStream的原理来自己实现MyBufferedInputStream:
package ioDemo; import java.io.*; /* * 装饰设计模式 * */ class MyBufferedInputStream{ private InputStream in; //定义一个指针变量,一个计数器。 private int pos = 0,count = 0; private byte[] buf = new byte[1024]; MyBufferedInputStream(InputStream in){ this.in = in; } //一次读一个字节,从缓冲区(字节数组)获取。 public int myRead()throws IOException{ if(count==0) { count = in.read(buf); if(count<0) { return -1; } pos = 0; byte b = buf[pos]; count--; pos++; /* * 因为read读取到的是二进制数据,二进制数据是由0和1组成的,有可能出现11111111 * 作为一个字节来讲11111111的十进制是-1,由于返回值是int类型,就会自动提升,int类型是32位,在前面补1, * 就成了11111111-11111111-11111111-11111111,他的值还是-1,在写入的while循环哪里,判断到-1就会停止循环, * 就导致了数据丢失,所以在这里&一个255,也就是二进制的00000000-00000000-00000000-11111111, * 11111111-11111111-11111111-11111111 * 00000000-00000000-00000000-11111111 * ————————————————————————————————————& 值都为1结果才为1。 * 00000000-00000000-00000000-11111111 * 结果不变, * 这样既保证了返回值不是-1,又没有改变二进制数据。 */ return b&255; }else if(count>0){ byte b = buf[pos]; count--; pos++; return b&255; } return -1; } public void myColse()throws IOException{ in.close(); } } public class MyBufferedInputStreamDemo { public static void main(String[] args) { MyBufferedInputStream mbis = null; BufferedOutputStream bos = null; try { mbis = new MyBufferedInputStream(new FileInputStream("陈小熊 - 济南济南.mp3")); bos = new BufferedOutputStream(new FileOutputStream("陈小熊 - 济南济南-2.mp3")); int by = 0; while((by=mbis.myRead())!=-1) { bos.write(by); } } catch (IOException e) { // TODO: handle exception System.out.println(e.toString()); } finally { try { if(mbis!=null) { mbis.myColse(); } if(bos!=null) { bos.close(); } } catch (IOException e2) { System.out.println(e2.toString()); } } } }
下面是运行结果: