Java I/O (三)随笔

来源:互联网 发布:手机淘宝店铺招牌图片 编辑:程序博客网 时间:2024/05/22 06:11

今天再写一点关于Java I/O中的一些概念的讲解!

1、1、流的分类

1、输入流和输出流

  • 划分依据:划分输入流和输出流是以程序运行所在的内存角度划分。
  • 这里写图片描述
  • 举例:
    -1、内存——(数据)————>硬盘 输出流
    -2、Server——(数据)————>Client
    Server端内存: 负责将数据输出到网络上 >>>输出流
    这里写图片描述

2、流的概念模型

  • inputStream和 Reader: 所有输入流的基类,前者字节输入流,后者字符输入流。
  • OutputStream和Writer: 所有输出流的基类,前者字节输出流,后者字符输出流。

(1)、输入流概念模型

1、把输入设备抽象成一个“水管”,这个水管里的每个“水滴”依次排列。而一个水滴就相当于一个数据单元字节/字符。
这里写图片描述

说明:
(1)、字节流和字符流处理方式都及其相似
(2)、输入流使用隐式记录指针:当前正准备从哪个“水滴”开始读取。输入流inputStream和Reader提供一些方法控制记录指针的移动。

(2) 输出流和输入流也同样相似:
-这里写图片描述

1、2、装饰器设计模式

  • 概念: 将节点流通过包装成为处理流或称为包装流处理。
  • 使用处理流典型思路:使用处理流包装节点流,程序通过处理流来执行输入/输出功能,让节点流与底层的I/O设备、文件交互。这里写图片描述
    如上图所示,将节点流包装为处理流,提供缓冲技术。增加缓冲功能后,可以提高输入输出效率,需要使用flush()方法才可以将缓冲区的内容刷出。
  • 小思考

我觉得之所以处理流会效率比较高,一方面的原因是因为:
BufferedReader还是BufferedWriter在循环读取时用到了readLine()方法,而readLine方法是一个利用read()方法包装了一个字符数组的方法。将读取到的内容存到数组中提供缓冲功能。
readline()方法,可以一次读取一行文本,以换行符为标志;如果没有读到换行符,则线程阻塞,直至读到换行符为止!

换行符表示:
Windows: \r\n
UNIX/linux : \n

1、3、计算机文件分类

一般来说,计算文件常分为两大类,一个是文本文件,另一个是二进制文件。

  • 文本文件:所有能用记事本打开并看到其中字符内容的文件。
  • 二进制文件:反之。
  • 关系:实际上,文本文件是特殊的二进制文件,当二进制文件里的内容能被正常解析成字符时,就变成了二进制文件。

1、字节流: 可以处理所有的二进制文件。
2、字符流:只能处理文本文件。

1、4、转换流

两个转换流:

  • InputStreamReader :字节输入流————>字符输入流
  • OutputStraemWriter:字节输出流————>字符输出流

功能:只能将 字节流————>字符流, 反之不可以!!!

那么问题来了,为什么只能将字节流转换为字符流,而不能将字符流转换为字节流呢?思考一下。。。。?

回答:字节流和字符流的差别就是操作的数据单元不同。字节流比字符流使用范围更广,但字符流比字节流操作更方便。如果有一个流已经是字符流了,也就说,是用一个用起来比较方便的流,为什么要转换为字节流呢?!反之,若有一个字节流,可以确定这个字节流的内容都是文本内容,那么把它转换为字符流处理就会更方便一些。所以Java只提供了字节流——————>>字符流。

1、5推回输入流PushBackInputStream和PushBackReader

先来看看API

这里写图片描述

这里只看三个方法,并介绍一个重要的概念:推回缓冲区。我觉得他对理解Java I/O流应该有帮助。
这里写图片描述

我们会发现这三个方法与InputStream和Reader中的三个read()方法一一对应。
这两个推回输入流都有一个推回缓冲区,当程序调用这两个推回输入流的unread()方法时,系统将会把指定数组的内容推回到该缓冲区里,而推回输入流每次调用read()方法总是先从推回缓冲器区读取,只有完全读取了推回缓冲区的内容后,但还没有装满read(0所需的数组时才会从原输入流中读取。

这里写图片描述
推回缓冲区默认长度为 1 。

原创粉丝点击