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


我们继续来聊聊I/O

一.字节流的缓冲区

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

  1. // 通过字节流的缓冲区拷贝图片
  2. public static void copyMp3() {
  3. try {
  4. FileInputStream fi = new FileInputStream("audio.mp3");
  5. BufferedInputStream buf = new BufferedInputStream(fi);
  6. FileOutputStream fio = new FileOutputStream("audioCapy.mp3");
  7. BufferedOutputStream buo = new BufferedOutputStream(fio);
  8. int ch = 0;
  9. while ((ch = buf.read()) != -1) {
  10. buo.write(ch);
  11. }
  12. buf.close();
  13. buo.close();
  14. } catch (FileNotFoundException e) {
  15. // TODO Auto-generated catch block
  16. e.printStackTrace();
  17. } catch (IOException e) {
  18. // TODO Auto-generated catch block
  19. e.printStackTrace();
  20. }
  21. }

这样,就直接拷贝了

二.自定义字节流缓冲区

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

  1. class MyBufferedImputStream {
  2. private InputStream in;
  3. private byte[] buf = new byte[1024];
  4. private int pos = 0;
  5. private int count = 0;
  6. public MyBufferedImputStream(InputStream in) {
  7. this.in = in;
  8. }
  9. // 从缓冲区一次读一个字节
  10. public int myRead() throws IOException {
  11. // 通过in对象读取硬盘上的数据,存储在buf
  12. if (count == 0) {
  13. count = in.read(buf);
  14. if (count < 0)
  15. return -1;
  16. byte b = buf[pos];
  17. count--;
  18. pos++;
  19. return b;
  20. } else if (count > 0) {
  21. byte b = buf[pos];
  22. pos++;
  23. count--;
  24. return b;
  25. }
  26. return -1;
  27. }
  28. //关闭流
  29. public void myClose() throws IOException {
  30. in.close();
  31. }
  32. }

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

三.读取键盘录入

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

  1. package com.lgl.hellojava;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. public class HelloJJAVA {
  5. public static void main(String[] args) throws IOException {
  6. /**
  7. * 通过键盘录入数据 当录入一行数据后,打印 发现over,停止
  8. */
  9. InputStream in = System.in;
  10. StringBuilder sb = new StringBuilder();
  11. while (true) {
  12. int ch = in.read();
  13. if (ch == '\r')
  14. continue;
  15. if (ch == '\n') {
  16. String s = sb.toString();
  17. if ("over".equals(s))
  18. break;
  19. System.out.println(s);
  20. // delte all
  21. sb.delete(0, sb.length());
  22. } else
  23. sb.append(ch);
  24. }
  25. }
  26. }

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

四.转换流InputStreamReader

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

  1. package com.lgl.hellojava;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. public class HelloJJAVA {
  7. public static void main(String[] args) throws IOException {
  8. //获取键盘录入对象
  9. InputStream in = System.in;
  10. //转换
  11. InputStreamReader isr = new InputStreamReader(in);
  12. //提高效率
  13. BufferedReader bur = new BufferedReader(isr);
  14. String line = null;
  15. while((line = bur.readLine()) != null){
  16. if(line.equals("over"))
  17. break;
  18. System.out.println(line.toString());
  19. }
  20. }
  21. }

我们来演示一下

五.写入转换流

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

  1. package com.lgl.hellojava;
  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. import java.io.OutputStream;
  8. import java.io.OutputStreamWriter;
  9. public class HelloJJAVA {
  10. public static void main(String[] args) throws IOException {
  11. //获取键盘录入对象
  12. InputStream in = System.in;
  13. //转换
  14. InputStreamReader isr = new InputStreamReader(in);
  15. //提高效率
  16. BufferedReader bur = new BufferedReader(isr);
  17. OutputStream os = System.out;
  18. OutputStreamWriter osw = new OutputStreamWriter(os);
  19. BufferedWriter bufw = new BufferedWriter(osw);
  20. String line = null;
  21. while((line = bur.readLine()) != null){
  22. if(line.equals("over"))
  23. break;
  24. bufw.write(line.toString());
  25. bufw.newLine();
  26. bufw.flush();
  27. }
  28. }
  29. }

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. 阿里云负载均衡SSL证书配置

    阿里云负载均衡SSL证书 转载请注明地址:http://www.cnblogs.com/funnyzpc/p/8908461.html 好久了呢,距上篇博客的这段时间中:考试.搬家.工作赶工.业务考察 ...

  2. lombok安装与简易教程(一)

    lombok简单的来讲就是在编译的时候,可以帮助我们生成getter与setter等方法,减少代码量.这可是一个好东西啊 1.eclipse安装lombok java -jar lombok.jar ...

  3. 自然语言处理工具:中文 word2vec 开源项目,教程,数据集

    word2vec word2vec/glove/swivel binary file on chinese corpus word2vec: https://code.google.com/p/wor ...

  4. 我在 Ubuntu 下使用 Sublime 编写 python 代码时遇到并解决的问题

    Ubuntu 下 Sublime 无法输入中文 解决方法如下: sudo apt-get update && sudo apt-get upgrade 克隆项目到本地 : git cl ...

  5. python的IDE(pycharm)安装以及简单配置

    使用IDE的好处 界面更友好,看起来更舒服 智能提示功能很赞,大大提高开发效率 pycharm的安装过程 去pycharm官网下载安装包,请下载专业版,建议不要去网上下载汉化版 点击安装包一直下一步即 ...

  6. async/await 的一些知识

    博文 Don't Block on Async Code What is the purpose of "return await" in C#? Any difference b ...

  7. Python笔记十一(迭代器)

    这里我们要学会Iterable和Iterator. 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的generator f ...

  8. Linux搭建lamp(Apache+PHP+Mysql环境)centos7.2版详细教程

    我们更多的网站服务器是选择了Linux系统,这里建议你选择centos,这也是阿里云ecs推荐的系统,在服务器上比较推荐centos,特别对于新手,首选CentOS,并不是centos比Debian和 ...

  9. django的流程和命令行工具

    django实现流程django #安装: pip3 install django 添加环境变量 #1 创建project django-admin startproject mysite ---my ...

  10. ubuntu16.04下安装opencv

    source url:http://blog.csdn.net/zhuiqiuk/article/details/5308505811 1 依赖包sudo apt-get install build- ...