java I/O流分类与识别概述

入门Java已经三年了,刚入门时,什么是io都感觉很新奇,但是那个时期已经过去了。现在,对过去那个对io感到未知和新奇的自己做一个总结

目录

导语:

正文部分:

一、字节流

字节流的分类

1.1、输入流(InputSteam)

1.2、输出流(OutputSteam)

二、字符流

字符流的分类

2.1、字符输入流Reader

2.2、字符输出流Writer


导语:

我们对计算机的认识是从小学开始的把,计算机这个词汇,注定要在我们一生中埋下一颗种子,对现代计算机体系的种子,也是融入现代生活必不可少的种子。

谁都知道计算机处理的只是一堆0和1,我们也知道1和0组成的序列是一个二进制数字,计算机中的二进制数字,每种组合都代表了不同的事物;转换成普通的人的理解,就是通过一串数字来标记各种在现实中存在的事物,可以是抽象的也可以是具体的。

如果二进制数字0代表非生物的话,那么二进制数字1就代表生物,如果二进制数字10代表低等生物的话,那么二进制数字11就代表高等生物;如果二进制数字110代表非灵长类动物的话,那么二进制数字111就代表灵长类动物。

没错,计算机科学把每种事物都做了一个标记,而且用数字来代替其意义,由此组成了计算机体系。

在此,我需要在这里提醒一下读者朋友

  • 读懂此文需要掌握Java面向对象编程特性之一——多态
  • 此文为概述,不涉及具体用法

 

要理解Java的io系统,必须从计算机的历史说起。大多数人都知道:现代意义上的计算机是在美国造出来的。

第一台计算机
现代意义上的第一台计算机

所以计算机天生就适用于说英文的人类使用,因为美国在计算机这个体系中定义了最开始的语言--英文。英文是由26个字母组成的,再加上他们为数不多断句标点符号,用十进制255以内的数字就可以就可以表示所有的英文符号了。

ASCII码表
ASCII码表

很显然,Java的出生时代,是在计算机使用者大部分都是英文的时代,所以不用考虑的太多文字的兼容问题,用英文就可以做大部分的事了,但是随着计算机制造成本的下降,计算机的使用者从少数人扩充到了全球,但是全球的语言不止英文一种。

因此在Java在第五个版本的时候,加入了一新的io(信息流),专门用来处理字符问题的工具类,因为使用这种新的类使得这门语言在开发起来要更加方便

java 的io系统
Java的io系统

注:以上图片引用自:https://blog.csdn.net/WuLex/article/details/103361789

但是也增加了入门成本,造成很多初学者在入门的时候对Reader,Writer,InputSteam,OutPutSteam的各种系列io(信息流)容易搞混,或者不知道他们出现的意义,甚至认为为什么搞这么复杂,简单一点不好么(没错,我就是这么认为的),但是事实上就是为了让开发者将事请变得简单和统一才这么做的,但很多时候初学者并不明白其中的意义。

正文部分:

一、字节流

计算机最开始的出现就是使用的字节流(一个字节8位二进制数字),通常来说一个字节可以标注大多数计算机内部指令了。但是一个字节却无法表示世界上的所有文字,在第二节我们再说这个问题。

字节流的分类

面向对象的编程语言有个特征,那就是要把所有的事物都分得很细。

因此,Java对象将信息流分为两种信息流,一个叫输入(InputSteam),一个叫输出(OutputSteam)。因为对我们使用者来说,计算机只需要做两件事,接收信息,输出信息。

一个是等待被计算机cpu处理的信息,叫做输入;还有一个是已经被计算机cpu处理好的信息然后发送出去的信息,叫做输出。

1.1、输入流(InputSteam)

输入流对于我们开发者来说,就是需要被我们编写的程序处理的信息,那就叫做输入流,因为程序要去读取信息,输入流可以理解为程序的读操作,也就是读取信息(输入流)。

在Java中确实有InputSteam这个类,但是他是个Java接口,所以不能被实例化,代表所有的二进制(或者叫字节输入流)输入流。字节流对处理英文完全没得问题,因为这是计算机自带的属性,也是英文的优势所在,但是输入流除了处理文字以外还能处理图片信息,还能处理视频信息,因为我们知道图片和视频也是一种二进制数字信息流,只不过InputSteam对人类文字的处理还不够强,所以引出了Reader 和 Writer 专门用于人类文字的处理。

因为InputSeam是一个Java接口,所以在Java的自带的包中包含了一个常用的InputSteam类的实现类(子类)。这些子类各有各的特点,我这里不再一一介绍。

1.2、输出流(OutputSteam)

开发者编写的程序除了获得信息外(输入信息),它当然还要给出我们要的信息结果,这可以理解为程序的处理完毕的输出信息。既然输出流是程序的处理结果,因此它是有价值的,我们如何处理这个信息结果呢。打印在屏幕上,或者保存在计算机的硬盘里,要么打印在纸上。无论如何,他就是代表结果信息的最终目的地。

当然光是输出信息可没那么简单,我们知道计算机的语言是二进制的,结果信息还得经过信息编译,也就是将二进制的语言编译为我们人类可识别的信息,流入图片,视频,语言文字。

Java 中存在OutputSteam,它也是接口,同样也有许多的实现类(子类),可以为我们所用

再次提醒

前面我只介绍了Java中顶级的信息流接口,但是具体怎么用,需要熟悉Java面向对象编程的的多态性,否则无法明白我描述的是什么

二、字符流

字符流的出现,是为了解决计算机全球化使用便捷性的问题,正如我在在第一节提到的一样,字节流无法解决多样性的人类文字需求,必须找到新的解决办法。由此国际组织发起动员,编写了一个“万国码”,顾名思义,包含了所有人类使用的文字,以解决计算机使用难度,万国后面加一个“码”字,仅仅是为了体现,他们只是一串数字代表的不同文字代码而已。

Java第五个版本加入了Reader和Writer两个接口来实现编程国际化,字符处理流是很有意义的,因为大多数情况下,文字表达信息最准确的的介质。反而图片和视频细节表达是千人千面的,但是视频和图片传达信息很直观,信息会受到个体影响而扭曲

字符流的分类

通常来说,除了英文以外的人类文字,需要跟多的二进制数字位来表示,但是本质上还是属于字节制流,需要更多的处理而已,但是Java把他们单独立一个接口,同样也说明了其重要性——特别是对国际化的编程的重要性。

2.1、字符输入流Reader

Reader是从Java5引入的一个接口,用于对人类文字信息流的读取,使人类文字转换问机器码,以供计算机处理。在查看Reader源码的时候我们可以发现,在其子类源码底层使用了InputSteamReader做了一层封装,这个InputSteamReader就是将字节流转换为字符流的介质,所以说字符流本质上还是属于字节流。只不过字节转换为万国码会有些麻烦。

2.2、字符输出流Writer

同样,Writer也是在Java第五个版本出来的。为了解决字符问题,最终作用和InputSteam一样的。

 

天太冷了,字符流就不在多做介绍了。。。。。。。

如果有什么写的不对的地方请,请鞭策我吧,我将改正!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值