再论javaIO之拷贝MP3(read方法返回int的原因)
来源:互联网 发布:cn域名需要备案吗 编辑:程序博客网 时间:2024/06/05 05:30
今天继续学习java 通过IO流拷贝MP3的问题.话说昨天成功通过字节流的两种方式(BufferedInputStream和FileInputStream)copy了一首歌,我们主要用了read和write方法实现了这一功能。那大家在用read方法时有没有发现一个问题,那就是为什么它返回的是一个int类型的值,而不是byte呢??下面我们通过模拟BufferedInputStream类来说明这个问题
Api文档中read方法描述(InputStream类):
代码如下:
import java.io.*;class MyBufferedInputStream//自定义BuffereedInputStream类{//装饰设计模式private InputStream in;private byte[] buffer=new byte[1024];privateint count=0;privateint pos=0;MyBufferedInputStream(InputStream in)//构造器{this.in=in;}//模拟read方法public int Myread()throws IOException{if(count==0){count=in.read(buffer);//计数器记录通过public int read(byte[] b)方法存//到数组缓冲区的数据的总字节数pos=0;//如果计数器为0,则位置指针归零if(count<0)return -1;}byte b=buffer[pos];pos++;count--;//return b&255;return b&0xff;//关键在此,为什么要返回b和0xff的与呢?}//重写close方法public void Myclose()throws IOException{in.close();}}class Demo{//为了代码简洁,这里直接抛IO异常了,正确的做法是try,catch。public static void main(String[] args)throws IOException{long start=System.currentTimeMillis();Copy();long end=System.currentTimeMillis();System.out.println("runtime:"+(end-start)+"ms");//获取运行时间}public static void Copy()throws IOException//拷贝功能封装在Copy方法体里面{MyBufferedInputStream mb=new MyBufferedInputStream(new FileInputStream("3.mp3"));BufferedOutputStream bo=new BufferedOutputStream(new FileOutputStream("copy_1.mp3"));int ch=0;while((ch=mb.Myread())!=-1)bo.write(ch);bo.close();mb.Myclose();}}
为什么myread方法返回的是b和0xff的与呢?
read方法返回int的原因:
首先我们知道,mp3文件全部为二进制数据组成的。这就有一个问题,如果恰好read方法读取的字节是1111-1111(即byte型的-1)怎么办?这时候返回的是-1.
那这样的话Copy方法中的while循环就会停止,也就没有复制。
解决方法:
我们伟大的程序员采取了一个办法.那就是返回int型
1111-1111如果变成int型的话,应该是int型的-1,即11111111-11111111-11111111-11111111,
我们将int型的-1和0xff &一下,
11111111-11111111-11111111-11111111
&00000000-00000000-00000000-11111111(int型的255)
-------------------------------------------------------------
00000000-00000000-00000000-11111111
这样返回的就是有效字节了,而且不会出现-1的情况。
read方法做了一个类型提升,其实write方法每次也是强转,将int型的数据再转换为byte,这样获取的还是有效字节。
////////********************************************************************************************************************************/
就是这样啦,最后祝大家新年快乐哦
- 再论javaIO之拷贝MP3(read方法返回int的原因)
- 为什么IO读取流的read方法返回的是int而不是byte的原因!
- (转)为什么IO读取流的read方法返回的是int而不是byte的原因!
- java基础--Java 字节读取流的read方法返回int的原因
- java基础--Java 字节读取流的read方法返回int的原因
- 为什么read()方法返回的是int类型而不是byte
- SocketChannel read方法一直返回0的原因
- 关于java字节流的read()方法返回int型而非byte型的思考
- 关于java字节流的read()方法返回int型而非byte型的思考
- 关于java字节流的read()方法返回值为int的思考
- Java 编程下 IO 中的输入流的 read() 方法返回值为什么是 int 值
- Java 编程下 IO 中的输入流的 read() 方法返回值为什么是 int 值
- Java 编程下 IO 中的输入流的 read() 方法返回值为什么是 int 值
- java 编程下 IO 中的输入流的 read() 方法返回值为什么是 int 值
- Java 编程下 IO 中的输入流的 read() 方法返回值为什么是 int 值
- JavaIO实现文件的拷贝
- Java中字节流和字符流的read()方法为什么返回的值是int类型
- Java中字节流和字符流的read()方法为什么返回的值是int类型
- Oracle 11g 新特性之 Oracle Restart Database 的安装与配置完全详解
- Cloud Foundry Service Node源码分析及实现【附下载】
- 规划(2013.1。10)
- poj1125--Stockbroker Grapevine--Floyd算法
- 《卓有成效的管理者》笔记,第二章 掌握自己的时间
- 再论javaIO之拷贝MP3(read方法返回int的原因)
- Java--------数组
- Windows Embedded Compact 7中的内存管理(上)
- 什么时候加上android.intent.category.DEFAULT
- Windows Embedded Compact 7中的内存管理(下)
- 启动Apache时提示错误“Cannot load php5apache2_2.dll into server”
- Apache无法启动解决 the requested operation has failed
- Linux下的Socket基础编程(2)
- 新年快乐