JAVA之旅(二十七)——字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律


我们继续来聊聊I/O

一.字节流的缓冲区

这个,和我们的字符流基本上没有什么差别,我们来拷贝mp3,看例子

// 通过字节流的缓冲区拷贝图片
    public static void copyMp3() {

        try {
            FileInputStream fi = new FileInputStream("audio.mp3");
            BufferedInputStream buf = new BufferedInputStream(fi);

            FileOutputStream fio = new FileOutputStream("audioCapy.mp3");
            BufferedOutputStream buo = new BufferedOutputStream(fio);

            int ch = 0;

            while ((ch = buf.read()) != -1) {
                buo.write(ch);
            }

            buf.close();
            buo.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

这样,就直接拷贝了

二.自定义字节流缓冲区

我们队缓冲区已经了解很多了,这样的话,我们来尝试解析他的原理然后自定义一个字节流的缓冲区出来,来看看对不对

class MyBufferedImputStream {

    private InputStream in;
    private byte[] buf = new byte[1024];
    private int pos = 0;
    private int count = 0;

    public MyBufferedImputStream(InputStream in) {
        this.in = in;
    }

    // 从缓冲区一次读一个字节
    public int myRead() throws IOException {
        // 通过in对象读取硬盘上的数据,存储在buf
        if (count == 0) {
            count = in.read(buf);
            if (count < 0)
                return -1;
            byte b = buf[pos];
            count--;
            pos++;
            return b;
        } else if (count > 0) {
            byte b = buf[pos];
            pos++;
            count--;
            return b;
        }
        return -1;
    }
    //关闭流
    public void myClose() throws IOException {
        in.close();
    }
}

思路是比较清晰的,想知道对不对,小伙伴赶紧去试试

三.读取键盘录入

这个其实早就要讲,现在讲就有点晚了,就是键盘输入文字读取

package com.lgl.hellojava;

import java.io.IOException;
import java.io.InputStream;

public class HelloJJAVA {
    public static void main(String[] args) throws IOException {
        /**
         * 通过键盘录入数据 当录入一行数据后,打印 发现over,停止
         */
        InputStream in = System.in;
        StringBuilder sb = new StringBuilder();
        while (true) {
            int ch = in.read();
            if (ch == '\r')
                continue;
            if (ch == '\n') {
                String s = sb.toString();
                if ("over".equals(s))
                    break;
                System.out.println(s);
                // delte all
                sb.delete(0, sb.length());
            } else
                sb.append(ch);

        }
    }
}

当我们写完之后就发现,这个写法我们之前是有写过的,就是readLine的原理,这样的话,我们可以对其进行改造一下,但是这里就产生了一个新的问题,一个是字符流,一个是字节流,那这里也就产生了一个思考,能不能将字节流转换成字符流,再去使用它缓冲区的readLine方法呢?

四.转换流InputStreamReader

java中需要转换流就会使用到转换流,使用到了InputStreamReader,你会发现十分的方便的

package com.lgl.hellojava;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class HelloJJAVA {
    public static void main(String[] args) throws IOException {
        //获取键盘录入对象
        InputStream in = System.in;
        //转换
        InputStreamReader isr = new InputStreamReader(in);
        //提高效率
        BufferedReader bur = new BufferedReader(isr);
        String line = null;
        while((line = bur.readLine()) != null){
            if(line.equals("over"))
                break;
            System.out.println(line.toString());
        }
    }
}

我们来演示一下

五.写入转换流

我们转换流的read学完了,我们就来学习一下write.我们继续增强上面的方法

package com.lgl.hellojava;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

public class HelloJJAVA {
    public static void main(String[] args) throws IOException {
        //获取键盘录入对象
        InputStream in = System.in;
        //转换
        InputStreamReader isr = new InputStreamReader(in);
        //提高效率
        BufferedReader bur = new BufferedReader(isr);

        OutputStream os = System.out;
        OutputStreamWriter osw = new OutputStreamWriter(os);
        BufferedWriter bufw = new BufferedWriter(osw);

        String line = null;
        while((line = bur.readLine()) != null){
            if(line.equals("over"))
                break;
            bufw.write(line.toString());
            bufw.newLine();
            bufw.flush();
        }
    }
}

OK,实现的功能也是正常的了;

六.流操作的规律

我们写了这么多流,我们来总结一下规律

  • 1

    • 源:键盘录入
    • 目的:控制台
  • 2 : 需求:想把键盘录入的数据存储到一个文件中
    • 源:键盘
    • 目的:文件
  • 3.需求:想要将一个文件的数据打印在控制台上
    • 源:文件
    • 目的:控制台

流操作的基本规律

  • 最痛苦的就是不知道流对象要用哪一个
  • 通过两个明确来完成
    • 1.明确源和目的

      • 源:输入流 InputStream Reader
      • 目的:输出流 OutputStream writer
    • 2.明确操作的数据是否是纯文本
      • 是:字符流
      • 不是:字节流
    • 3.当体系明确后,再明确要使用哪个具体的对象
      • 通过设备来进行区分
      • 源设备:内存,硬盘,键盘
      • 目的:内存,硬盘,控制台。

前面两个是比较重要的,也可以明确出来,第三个就是加分项了

I/O就先到这里了,我们下篇继续聊,同时开始讲File了

有兴趣的可以加群:555974449

JAVA之旅(二十七)——字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律的更多相关文章

  1. JAVA之旅(十七)——StringBuffer的概述,存储,删除,获取,修改,反转,将缓存区的数据存储到数组中,StringBuilder

    JAVA之旅(十七)--StringBuffer的概述,存储,删除,获取,修改,反转,将缓存区的数据存储到数组中,StringBuilder 讲完String,我们来聊聊他的小兄弟 一.StringB ...

  2. Java基础---Java---IO流-----读取键盘录入、InputStreamReader、转换流、OutputStreamWriter、InputStreamReader

    字符流: FileReader FileWriter BufferedReader BufferedWriter 字节流: FileInputStream FileOutputStream Buffe ...

  3. Java基础(二十七)Java IO(4)字符流(Character Stream)

    字符流用于处理字符数据的读取和写入,它以字符为单位. 一.Reader类与Writer类 1.Reader类是所有字符输入流的父类,它定义了操作字符输入流的各种方法. 2.Writer类是所有字符输出 ...

  4. Java进阶专题(二十七) 将近2万字的Dubbo原理解析,彻底搞懂dubbo (下)

    ...接上文 服务发现 服务发现流程 整体duubo的服务消费原理 Dubbo 框架做服务消费也分为两大部分 , 第一步通过持有远程服务实例生成Invoker,这个Invoker 在客户端是核心的远程 ...

  5. Java开发学习(二十七)----SpringMVC之Rest风格解析及快速开发

    一.REST简介 REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格 当我们想表示一个网络资源的时候,可以使用两种方式: 传统风格资源描 ...

  6. Spring Boot 入门系列(二十七)使用Spring Data JPA 自定义查询如此简单,完全不需要写SQL!

    前面讲了Spring Boot 整合Spring Boot JPA,实现JPA 的增.删.改.查的功能.JPA使用非常简单,只需继承JpaRepository ,无需任何数据访问层和sql语句即可实现 ...

  7. Java从零开始学二十七(NumberFormat类)

    一.NumberFormat表示数字的格式化类 NumberFormat表示数字的格式化类,即:可以按照本地的风格习惯进行数字的显示. No. 方法 类型 描述 1 public static Loc ...

  8. Java学习笔记二十七:Java中的抽象类

    Java中的抽象类 一:Java抽象类: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就 ...

  9. java 面向对象(二十七):注解的使用

    1. 注解的理解① jdk 5.0 新增的功能*② Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理.通过使用 Annotation, ...

随机推荐

  1. 面试(二)---synchronized

    一.前言        本来计划将ConcurrentHashMap和HashMap对比着来说下,奈何看的源码有点懵逼,我在思考思考,等等有个清晰的思路在搞起来,我们先来谈一下synchronized ...

  2. Node.js系列文章:利用console输出日志文件

    通常我们在写Node.js程序时,都习惯使用console.log打印日志信息,但这也仅限于控制台输出,有时候我们需要将信息输出到日志文件中,实际上利用console也可以达到这个目的的,今天就来简单 ...

  3. docker管理工具

    Portainer是Docker的图形化管理工具,提供状态显示面板.应用模板快速部署.容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作).事件日志显示.容器控制台操作.Swarm集群和服 ...

  4. 聊聊jstack的工作原理

    实现一个jstack 在聊Jstack得工作原理前呢,不如让我们先写一个简单的jstack玩玩.不用怕,很简单的,就几行代码的事,看: public class MyJstack { public s ...

  5. Bootstrap3 表单-水平排列的表单

    通过为表单添加 .form-horizontal 类,并联合使用 Bootstrap 预置的栅格类,可以将 label 标签和控件组水平并排布局.这样做将改变 .form-group 的行为,使其表现 ...

  6. Openstack: Single node Installation and External Network Accessing Configuration Guide

    Summary of installation Step 0: Prerequisites Step 1: Create Openstack hostsystem Step 2: Config Ope ...

  7. Elasticsearch+Hbase实现海量数据秒回查询

    ---------------------------------------------------------------------------------------------[版权申明:本 ...

  8. Request JSON

    https://developer.android.com/training/volley/request.html Request JSON Volley provides the followin ...

  9. JFinal中使用QuartzPlugin报ClassCastException解决方法

    JDK1.8中泛型反射修改对旧版本的影响 本文地址:http://blog.csdn.net/sushengmiyan 本文作者:苏生米沿 问题复现环境: JDK1.8 JFinal1.9 quart ...

  10. 改善database schema

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/50422102 本文作者:苏生米沿 Hibernate 读取你java模型类的映射元数据 ...