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 }

转载于:https://www.cnblogs.com/yangyongqian/p/5153271.html

IO 流 自定义字节流的缓冲区-read 和write 的特点相关推荐

  1. java 的io流需要学吗_Java的IO流之字节流,必须要学得内容,你会嘛?

    原标题:Java的IO流之字节流,必须要学得内容,你会嘛? 伙伴们~ 端午节过的如何呀~ 有没有很开心呀~ 假期已过咱们继续开动了 IO流 先来认识一下IO流: IO流用来处理设备之间的数据传输,Ja ...

  2. Io流的字节流与缓冲流

    当我们队大量数据进行保存时可以用数组,当数据到达一定量时或给用户一个易懂得接口时就可采用IO流:  IO流按进行的操作分输出流与输入流InputStream与OutputSteam 按操作的原理来分有 ...

  3. JavaSE(十七)——IO流之字节流

    文章目录 1. 概述 2. FileOutputStream写出数据 3. FileInputStream读取数据 4. 字节流复制文本文件 5. 字节流复制MP3 6. 高效的字节输入输出流 1. ...

  4. IO流、字节流和字符流

    Java 一.IO流 1.1 概念 1.2 分类 1.3 IO流的父类 二.字节流 2.1 概念 2.2 OutputStream 2.2.1 常用方法 2.2.2 FileOutputStream类 ...

  5. IO流之字节流字符流理解

    目录: 一.什么是IO流 : 二.流的分类: 三.字节流解析: 四.字符流解析: 五.序列流(合并流): 一.什么是IO流  简单说就是将数据(文本,音频,视频,图片等)以流的形式进行读写. 举个栗子 ...

  6. java -- IO流之字节流

    Java类库中的IO类,可以从不同的角度将其进行不同的分类.比如按数据的流向可分分为输入流和输出流:按数据处理单位的不同,又可将其分为字节流和字符流.但不管怎样分,其本质都是一样的.本人更倾向将其分成 ...

  7. java基础10(IO流)-字节流

    IO流 输入与输出[参照物是程序] 如果从键盘.文件.网络甚至是另一个进程(程序或系统)将数据读入到程序或系统中,称为输入 如果是将程序或系统中的数据写到屏幕.硬件上的文件.网络上的另一端或者是一个进 ...

  8. IO流,字节流文件拷贝示例 [FileInputStream FileOutputStream]

    字节流文件拷贝FileInputStream FileOutputStream: import java.io.File; import java.io.FileInputStream; import ...

  9. IO流,字节流和字符流

    一.概述 IO流用来处理设备之间的数据传输 上传文件和下载文件 Java对数据的操作是通过流的方式 Java用于操作流的对象都在IO包中 二.IO流的分类: (1)流向:         输入流 读取 ...

最新文章

  1. torch_{geometric/scatter}中一些函数的用法(softmax,scatter)
  2. 韩文版ie8 启用java_只有在启用了javascript的情况下,IE8才会在IE8模式下重新加载崩溃...
  3. 共享内存生产者消费者模型
  4. Cheerleaders【容斥】
  5. [转载] java中的经典问题:传值与传引用
  6. Could not find module ‘D:\codna\Library\bin\geos_c.dll‘
  7. 力扣326.3的幂 C/C++
  8. 微软对 Windows 10 Mobile 的支持将于12月10日结束
  9. 使用 matlab 数据集的生成(generate datasets)
  10. 如何在Mac上创建和移除替身
  11. 研发管理系统选型必读
  12. 连接NI采集箱9181与9184
  13. 使用Github上传本地项目代码
  14. 缓冲流、转换流、序列化流、装饰设计模式、comms-io工具包
  15. mysql+两行+一样+筛选_Excel两行交换及两列交换,快速互换相邻表格数据的方法...
  16. java 实现站内信_站内信设计
  17. Kotlin 正则表达式
  18. 分享wifidog的增强版: wifidogx
  19. 多个计算机组成一个,怎么将两台计算机组成一个集群?
  20. conda创建环境并下载d2l软件包

热门文章

  1. {}是set类型还是dict类型呢
  2. alive workers 数量为0的解决方案
  3. linux 有用的命令,linux有用命令(持续更新)
  4. P1080 国王游戏(贪心)
  5. opencv 罗曼滤波_勒罗曼杜罗伊
  6. 从刘备面试诸葛亮看信息系统项目管理师
  7. Three.js中实现点击按钮添加删除旋转立方体
  8. Visual Studio中怎样更改Nuget程序包源
  9. CentOS6中怎样将jdk1.7升级到1.8
  10. SSM项目中怎样引入并使用Bootstrap