黑马程序员技术交流社区
标题: 自定义字节流缓冲区的问题 [打印本页]
作者: a2213502 时间: 2013-8-18 17:12
标题: 自定义字节流缓冲区的问题
本帖最后由 a2213502 于 2013-9-3 10:12 编辑
- import java.io.*;
- class CopyMp3
- {
- public static void main(String[] args) throws IOException
- {
- copyMp3_1();
- }
- public static void copyMp3_1() throws IOException
- {
-
- MyBufferedInputStream mbis = new MyBufferedInputStream(new FileInputStream ("F:\\chengchengwang\\heimaliti\\0.mp3"));
- BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("F:\\chengchengwang\\heimaliti\\5.mp3"));
- int by=0;
- while((by=mbis.Myread())!=-1)
- {
- bos.write(by);
- }
- mbis.Myclose();
- bos.close();
- }
-
-
- }
- /*自定义一个缓冲区,
- 首先定义一个数组
- 定义一个指针
- 定义一个计数器
- */
- class MyBufferedInputStream
- {
- private InputStream in;
- private int count =0;
- private int pos =0;
- private byte buf [] =new byte[1024];
- MyBufferedInputStream(InputStream in)
- {
- this.in=in;
- }
- public int Myread()throws IOException
- {
- if(count==0)
- {
- count=in.read(buf);
- if(count<0)
- return -1;
-
- pos=0;
- byte b =buf[pos];
- pos++;
- return b;
- }
- else if (count>0)
- {
- byte b =buf[pos];
- count--;
- pos++;
- return b;
- }
- return -1;
-
- }
- public void Myclose()throws IOException
- {
- in.close();
- }
- }
复制代码
作者: 月黑风高 时间: 2013-8-28 18:16
标题: 缓冲区中无非就是封装了一个数组,并可供外界访问
本帖最后由 月黑风高 于 2013-8-28 18:21 编辑
/*
* 自定义读取缓冲区,其实就是模拟一个BufferedReader
* 分析:
* 缓冲区中无非就是封装了一个数组,并对外提供了更多的方法对数组进行访问。
* 其实这些方法操作的就是数组的角标。
*
* 原理:
* 从源中获取一批数据装进缓冲区中,在从缓冲区中不断的取出一个一个数据。
* 取完后,再继续从源中取一批数据,当源中的数据取光时,用-1作为结束标记。
*/
代码展示:
public class MyBufferedReader {
private FileReader r;
//针对FileReader的高效流缓冲区
MyBufferedReader(FileReader r){
this.r=r;
}
//定义一个数组作为缓冲区
private char[] chs=new char[1024];
//定义一个指针,便于操作数组中的元素,当操作到最后一个元素后,指针应该归0
private int pos=0;
//定义一个计数器用于记录缓冲区中的数据个数,当该数据减到0,就从源中继续获取数据到缓冲区中。
private int count=0;
public int myRead() throws IOException{
if(count==0){
//计数器为0,从源中获取数据到缓冲区中
count=r.read(chs);
//每次从源中取一批数据,指针归0
pos=0;
}
//如果取出,返回值为-1,说明取完了。
if(count<0)
return -1;
//每次取一个字符,指针后移,这批总的数据量减少
char ch=chs[pos++];
count--;
return ch;
}
}
作者: 影响力147753321 时间: 2013-8-28 22:26
哥们,你的代码有误应该改下。import java.io.*;
class CopyMp3
{
public static void main(String[] args) throws IOException
{
copyMp3_1();
}
public static void copyMp3_1() throws IOException
{
MyBufferedInputStream mbis = new MyBufferedInputStream(new FileInputStream ("D:\\4.mp3"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\5.mp3"));
int by=0;
while((by=mbis.Myread())!=-1)
{
bos.write(by);
}
mbis.Myclose();
bos.close();
}
}
/*自定义一个缓冲区,
首先定义一个数组
定义一个指针
定义一个计数器
*/
class MyBufferedInputStream
{
private InputStream in;
private int count =0;
private int pos =0;
private byte buf [] =new byte[1024];
MyBufferedInputStream(InputStream in)
{
this.in=in;
}
public int Myread()throws IOException
{
if(count==0)
{
count=in.read(buf);
if(count<0)
return -1;
pos=0;
byte b =buf[pos];
count--;//这个你忘记加了。会造成下边数组越界异常
pos++;
return b&255;//这个也要加,防止为-1
}
else if (count>0)
{
byte b =buf[pos];//前面忘记加了。会造成这里数组越界异常。因为count少减一次,会使指针多加一次
count--;
pos++;
return b&0xff;//这个也要加,防止为-1
}
return -1;
}
public void Myclose()throws IOException
{
in.close();
}
}
作者: 以防万一 时间: 2013-8-31 14:29
{:soso_e176:}
亲,请问下问题是否解决?
如果已解决请及时将未解决改为已解决
如果未解决请回帖追问
三天未回复的将视为已解决
保持队形,谢谢合作{:soso_e121:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |