今天继续学习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,这样获取的还是有效字节。

////////********************************************************************************************************************************/

就是这样啦,最后祝大家新年快乐哦大笑

更多相关文章

  1. eclipseIDE for Java EE 下 离线 安装CDT的方法
  2. 在servlet中的init方法得到了对数据库操作的值,怎么传给前端
  3. Java 字节流与字符流的总结和理解
  4. 【JAVA】用java编写程序时总提示缺少方法主体或声明抽象的原因
  5. JAVA 静态方法和静态变量和final和※静态import※
  6. java如何通过反射 激活静态类的静态方法
  7. 实现<table>标签的动态新增和后台接受<table>标签的方法
  8. java通过映射取得方法对一个类的变量进行赋值
  9. “不是抽象的,也不重写抽象的方法”错误

随机推荐

  1. android初级
  2. Android 开机图片/文字/动画 修改
  3. Android震动---启动、循环、取消控制
  4. Android(安卓)Studio 快捷键
  5. Android(一) 安卓概述
  6. Android Mac开发Android推荐软件
  7. android:layout_paddingLeft和android:la
  8. Android(安卓)NDK开发篇(一) windows免cygw
  9. Android引路蜂地图开发包
  10. Android Animation 大全