• IO 流 自定义字节流的缓冲区-read 和write 的特点


     1 package com.yyq;
     2 /*
     3  * 字节流的缓冲区
     4  * 为什么会造成这种问题呢?
     5  * 小原理:  第一个字节返回的是 -1??? 为什么会是 -1呢??
     6  * 11111110000110101000
     7  * 读一个字节 ,读取到了8个二进制位 1111-1111 -1  
     8  * byte 类型  的  -1 --------》int: -1
     9  * 11111111   -1 读到连续八个1 就会停下来
    10  * 补位的时候  它补的是  00000000 能保证不会停下来
    11  * 那么只要在前面补0 ,既可以保留原字节的数据不变,又可以避免-1的出现
    12  * 11111111 11111111 11111111 11111111
    13  * 00000000 00000000 00000000 11111111
    14  * ------------------------------------
    15  * 00000000 00000000 00000000 11111111 进行与操作
    16  * read 进行了强制转换,将最低8位保留下来了
    17  * write 方法在提升,4个字节
    18  * 这种机制保证了数据的原样性
    19  */
    20 import java.io.*;
    21 class MyBufferedInputStream{
    22     private InputStream in;
    23     
    24     private byte[] buf = new byte[1024];
    25     private int pos = 0;
    26     private int count = 0;
    27     MyBufferedInputStream(InputStream in){
    28         this.in = in;
    29     }
    30     // 自定义一个read 方法 
    31     //一次读一个字节,重缓冲区)(字节数组)获取
    32     public int myRead() throws IOException{
    33         // 通过in对象读取硬盘上的数据,并存储在buf中
    34         if(count == 0){
    35             
    36             count = in.read(buf);
    37             if(count<0){
    38                 return -1;
    39             }
    40             pos = 0;
    41             byte b = buf[pos];
    42             count--;
    43             pos++;
    44             return b&255;
    45         }
    46         else if(count>0){
    47             byte b = buf[pos];
    48             count--;
    49             pos++;
    50             return b&255;
    51         }
    52         return -1;
    53     }
    54     public void myClose() throws Exception{
    55         in.close();
    56     }
    57 }
    58 public class CopyMP3 {
    59     public static void main(String[] args) throws Exception {
    60         long start = System.currentTimeMillis();
    61         copy_1();
    62         long end = System.currentTimeMillis();
    63         System.out.println(end-start);
    64     }
    65     public static void copy_1() throws Exception{
    66         MyBufferedInputStream bufis = new MyBufferedInputStream(
    67                 new FileInputStream("1.jpg"));
    68         BufferedOutputStream bufos = new BufferedOutputStream(
    69                 new FileOutputStream("2.jpg"));
    70         byte[] buf = new byte[1024];
    71         int num = 0;
    72         while((num = bufis.myRead())!=-1){
    73             bufos.write(num);
    74         }
    75     }
    76 }
  • 相关阅读:
    SET/JFace ProgressIndicator的使用以及来回滚动进度条实际使用示例
    Java/SWT/JFace项目打包总结注意事项
    StyledText实现的简单Java类文件编辑器
    命令行界面的简单银行系统
    TC二次开发遇到的问题总结
    用Java模仿简单的Ping命令
    Oracle SQL Developer定制每天执行一次存储过程的计划任务
    关于SpringMVC中text/plain的编码导致的乱码问题解决方法
    Spring框架下的定时任务quartz框架的使用
    Delphi 函数参数修饰中的var 、out和const
  • 原文地址:https://www.cnblogs.com/yangyongqian/p/5153271.html
Copyright © 2020-2023  润新知