import java.io.*;
class MyBufferedInputStream
{
private InputStream in;
private byte[] buf = new byte[1024*4];
private int pos = 0;//用于操作数组元素的指针(索引,角标)。
private int count = 0;//记录住每一次往数组中存储的元素个数。
MyBufferedInputStream(InputStream in)
{
this.in = in;
}
/*
为什么,字节读取流的read方法一次读一个字节,返回值类型,不是byte,而是int呢?
那是因为,在读取一个字节数据时,容易出现连续8个1的情况,连续8个1是-1.
正好符合了流结束标记。所以为了避免,流操作数据是提前结束,
将读到的字节进行int类型的提升。保留该字节数据的同时,前面都补0.避免-1的情况。
*/
public int myRead()throws IOException
{
//使用流对象从硬盘抓一批进数组缓冲区。
if(count==0)
{
count = in.read(buf);
if(count<0)
return -1;
pos = 0;
byte b = buf[pos];
pos++;
count--;
return b&255;
}
else if(count>0)
{
byte b = buf[pos];
pos++;
count--;
return b&0xFF;
}
return -1;
}
public void myClose()throws IOException
{
in.close();
}
}
=========调用以上类======
public static void copyMp3()throws IOException
{
MyBufferedInputStream bufis = new MyBufferedInputStream(new FileInputStream("c:\\0.mp3"));
BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("c:\\6.mp3"));
int temp = 0;
while((temp=bufis.myRead())!=-1)
{
bufos.write(temp);//输出流的write方法虽然接收是一个整数,四个字节,但是write只将最后一个字节写出。
//其他字节抛弃。
}
bufos.close();
bufis.myClose();
}
|