自定义字节流缓冲区,演示缓冲区的工作原理
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(); } }
相关文章推荐
- OBS (open boardcast server)结构分析
- Redis初级介绍
- Loadrunner:安装LR11时提示缺少vc2005_sp1_with_atl_fix_redist
- NGINX(七)分段下载
- linux 输入子系统(2) platform device
- 当配置改变的时候处理事件onConfigurationChanged
- CGI C上传文件以及大小限制修改
- iOS 应用安装失败原因排查
- php中删除、清空session的方式总结
- Android内存泄露检测(LeakCanary)
- Spring MVC Controller单例陷阱
- Android——编译release版签名系统
- c++运算符使用友元函数重载问题
- 【MongoDB初识】-其他操作
- NGINX(六)扩展
- NGINX(五)模块
- NGINX(四)配置解析
- LINQ 图解
- 使用Cocopods遇到的一些问题
- QT弹出消息框