实现自定义BufferedInputStream

简介: 根据BufferedInputStream的原理来自己实现MyBufferedInputStream

根据BufferedInputStream的原理来自己实现MyBufferedInputStream:

package ioDemo;
import java.io.*;
/*
 * 装饰设计模式
 * */
class MyBufferedInputStream{
  private InputStream in;
  //定义一个指针变量,一个计数器。
  private int pos = 0,count = 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++;
      /*
       * 因为read读取到的是二进制数据,二进制数据是由0和1组成的,有可能出现11111111
       * 作为一个字节来讲11111111的十进制是-1,由于返回值是int类型,就会自动提升,int类型是32位,在前面补1,
       * 就成了11111111-11111111-11111111-11111111,他的值还是-1,在写入的while循环哪里,判断到-1就会停止循环,
       * 就导致了数据丢失,所以在这里&一个255,也就是二进制的00000000-00000000-00000000-11111111,
       * 11111111-11111111-11111111-11111111
       * 00000000-00000000-00000000-11111111
       * ————————————————————————————————————& 值都为1结果才为1。
       * 00000000-00000000-00000000-11111111
       * 结果不变,
       * 这样既保证了返回值不是-1,又没有改变二进制数据。
       */
      return b&255;
    }else if(count>0){
      byte b = buf[pos];
      count--;
      pos++;
      return b&255;
    }
    return -1;
  }
  public void myColse()throws IOException{
    in.close();
  }
}
public class MyBufferedInputStreamDemo {
  public static void main(String[] args) {
    MyBufferedInputStream mbis = null;
    BufferedOutputStream bos = null;
    try {
      mbis = new MyBufferedInputStream(new FileInputStream("陈小熊 - 济南济南.mp3"));
      bos = new BufferedOutputStream(new FileOutputStream("陈小熊 - 济南济南-2.mp3"));
      int by = 0;
      while((by=mbis.myRead())!=-1) {
        bos.write(by);
      }
    } catch (IOException e) {
      // TODO: handle exception
      System.out.println(e.toString());
    } finally {
      try {
        if(mbis!=null) {
          mbis.myColse();
        }
        if(bos!=null) {
          bos.close();
        }
      } catch (IOException e2) {
        System.out.println(e2.toString());
      }
    }
  }
}

下面是运行结果:

相关文章
|
7天前
|
存储 Java 调度
FileInputStream,FileOutputStream 和 FileReader ,FileWriter 类的基本使用【 File类+IO流知识回顾②】
这篇文章回顾了Java中FileInputStream、FileOutputStream、FileReader和FileWriter类的基本使用方法,包括读取和写入文件的操作,以及字符流和字节流的区别和应用场景。
FileInputStream,FileOutputStream 和 FileReader ,FileWriter 类的基本使用【 File类+IO流知识回顾②】
|
4月前
|
Java 数据处理 开发者
Java IO流专家级教程:深入理解InputStream/OutputStream和Reader/Writer的内部机制
【6月更文挑战第26天】Java IO流涉及字节流(InputStream/OutputStream)和字符流(Reader/Writer),用于高效处理数据输入输出。InputStream/OutputStream处理二进制数据,常使用缓冲提升性能;Reader/Writer处理文本,关注字符编码转换。两者都有阻塞IO操作,但Java NIO支持非阻塞。示例代码展示了如何使用FileInputStream/FileOutputStream和FileReader/FileWriter读写文件。理解这些流的内部机制有助于优化代码性能。
99 0
|
存储 Java
文件IO之 File 类和 InputStream, OutputStream 的用法(一)
文件IO之 File 类和 InputStream, OutputStream 的用法
73 0
|
索引
文件IO之 File 类和 InputStream, OutputStream 的用法(三)
文件IO之 File 类和 InputStream, OutputStream 的用法
93 0
|
11月前
|
Java
File操作-InputStream/OutputStream及是否创建文件
File操作-InputStream/OutputStream及是否创建文件
72 0
|
Java
文件IO之 File 类和 InputStream, OutputStream 的用法(二)
文件IO之 File 类和 InputStream, OutputStream 的用法
90 0
|
Java
Java IO流之访问文件的字节输入流FileInputStream和字节输入流FileOutputStream的详解
Java IO流之访问文件的字节输入流FileInputStream和字节输入流FileOutputStream的详解
96 0
|
存储 编解码 缓存
InputStream、OutputStream、Reader、Writer的基本概念和使用方法
InputStream、OutputStream、Reader、Writer的基本概念和使用方法
130 0
|
存储 缓存 Java
【Java I/O 流】字符输入输出流:Reader 和 Writer
前面我们已经学会了字节流的使用,本篇开始介绍字符流。字符输入输出流是所有字符流的超类,学会了它们的方法,也基本上掌握了其子类的使用了。
121 0
|
存储 缓存 Java
【Java I/O 流】文件字符输入输出流:FileReader 和 FileWriter
本篇文章主要讲述“文件字符输入流”和“文件字符输出流”两个类的使用,并列举了一些读写案例,帮助学习。
546 0