2021-12-06_自定义字节流的缓冲区-read和write的特点
学习B站Java教程P241:自定义字节流的缓冲区-read和write的特点
import java.io.*; class MyBufferedInputStream { private InputStream in; private byte[] buf = new byte[1024]; private int pos = 0, count = 0; MyBufferedInputStream(InputStream in) { this.in = in; } //一次读一个字节,从缓冲区(字节数组)获取 public int myRead() throws IOException { //通过in对象读取硬盘上数据,并存储buf中。 if (count == 0) { count = in.read(buf); if (count < 0) { return -1; } pos = 0; byte b = buf[pos]; count--; pos++; return b & 0xff; } else if (count > 0) { byte b = buf[pos]; count--; pos++; return b & 0xff; } return -1; } public void myClose() throws IOException { in.close(); } } /* 11111111-111111110000111010001011100010101001111010 byte:-1 ---> int:-1 11111111 提升为 11111111 11111111 11111111 11111111 改为前面补0: 00000000 00000000 00000000 11111111:255 11111111 -->提升为int类型 那不还是-1吗?是-1的原因是因为在8个1前面补的是1导致的。 那么我只要在前面补0,既可以保留原字节数据不变,又可以避免-1的出现。 11111111 11111111 11111111 11111111 & 00000000 00000000 00000000 11111111 -------------------------------------- 00000000 00000000 00000000 11111111 备注:read方法,在向上提升,往前面补0,保证不是-1这种情况的发生, 而write方法,其实在做一个强转动作,只写最低的8位(即最低的一个字节)(其余的全砍掉), 即写出去的还是有效数据。从而保证了数据的有效性。 0000-0001:1 求-1:对1进行取反加1 1111-1110 +0000-0001 =1111-1111:-1 */
在如下的copy_2()方法中使用自定义字节流的缓冲区(备注:下面这些代码里,只有copy_2()方法是今天敲的,其余代码是好长时间之前敲的,不是今天新学的):
/* 演示MP3的复制,通过缓冲区。 BufferedOutputStream BufferedInputStream */ import java.io.*; class CopyMp3 { public static void main(String[] args) throws IOException { long start = System.currentTimeMillis(); copy_1(); long end = System.currentTimeMillis(); System.out.println("copy_1:" + (end - start) + "毫秒"); // copy_1:420毫秒 long start2 = System.currentTimeMillis(); copy_2(); long end2 = System.currentTimeMillis(); System.out.println("copy_2:" + (end2 - start2) + "毫秒"); } public static void copy_2() throws IOException { MyBufferedInputStream bufis = new MyBufferedInputStream(new FileInputStream("d:\\0.mp3")); BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("d:\\2.mp3")); int by = 0; while((by = bufis.myRead()) != -1) { bufos.write(by); } bufos.close(); bufis.myClose(); } // 通过字节流的缓冲区来完成复制 public static void copy_1() throws IOException { BufferedInputStream bufis = new BufferedInputStream(new FileInputStream("d:\\0.mp3")); BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("d:\\1.mp3")); int by = 0; while((by = bufis.read()) != -1){ bufos.write(by); } bufos.close(); bufis.close(); } }