您的位置:首页 > 其它

自定义字节流缓冲区,演示缓冲区的工作原理

2015-10-09 14:43 288 查看
package bytetest;

import java.io.IOException;
import java.io.InputStream;

public class MyBufferedInputStream {

private InputStream in;
private byte[] buf = new byte[1024];
private int pos = 0;
private int count = 0;

public MyBufferedInputStream(InputStream in) {
this.in = in;
}

// 一次读一个字节,从缓冲区(字节数组)获取
public int myRead() throws IOException {

// 通过in对象读取硬盘上数据,并存储buf中。
if (count == 0) {
count = in.read(buf);
pos = 0;
byte b = buf[pos];
count--;
pos++;
return b & 255;     //向上提升到int,防止读到  11111111(-1)而意外终止,
} else if (count > 0) {
byte b = buf[pos];
count--;
pos++;
return b & 255;
}
return -1;
}

public void myClose() throws IOException {
in.close();
}
}


测试

package bytetest;

import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyMp3 {

public static void main(String[] args) throws IOException {
copyMp3_2();
}

public static void copyMp3_2() throws IOException {
MyBufferedInputStream bufis = new MyBufferedInputStream(
new FileInputStream("1.mp3"));
BufferedOutputStream bufos = new BufferedOutputStream(
new FileOutputStream("3.mp3"));

int by=0;

while((by=bufis.myRead())!=-1){     //将byte强转成int
bufos.write(by);    //将读到的 int 类型的数据强转回 byte 再写入
}

bufos.close();
bufis.myClose();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: