Java操作字符流与字节流

前言:这几天在做一些文件的解压加密上传工作,经常用到Java操作字符流与字节流,所以总结一下,也是在慕课网上学习 一站式学习Java网络编程 全面理解BIO/NIO/AIO 第三章1,2节做的笔记

目录

第一章 前言

第二章 java.io 之字符流

第三章 java.io 之字节流

第四章 java.io里的装饰器模式


第一章 前言

网络编程的本质是进程之间的通信,比如说在客户端有一个浏览器的应用进程,我们如果想要从服务器端接收不同的网页、文件,我们就需要向服务器发送我们的请求,服务器端收到我们的请求进行处理,然后把我们请求的对应的数据发送给客户端,所以网络上进行的活动就是客户端和服务器端两个进程之间进行的数据交换,也就是数据通信。

通信的基础是IO模型,假设我们有一个数据源,然后我们要把数据输入到我们的应用进程里,那么从应用的角度来说,这一串就是输入流,反之则是输出流。

数据源可以是多种多样的,如文件、对象(Java中实现了Serializable接口的对象可以被序列化,就可以像字节流一样传输)、字符串等,

java.io提供了各种的工具可以操作输入输出流,是一个大家族,java.io包里的类处理的流分为两种字节流与字符流,字节流处理的是字节,字节就是有8位的bit,字符流处理的是字符,一般一个字符由两三个字节组成,直接处理字符的话就省去了我们将读取到的字节转换成字符的过程,字符流帮我们做了转换,让我们可以更轻松地处理字符。下面的四个类分别是处理字符、字节流的抽象类,java.io中有很多子类实现了它们。

 

第二章 java.io 之字符流

第一个CharArrayReader表明我们的应用是从一个字符数组里不断地读取数据流,StringReader是从字符串中不断地读取内容。当我们创建CharArrayReader与StringReader要把数据源传入。

同理,CharArrayWriter是输出到字符数组,StringWriter是输出到字符串中。

可以看到,我们不需要做字符字节之间的转换,这是字符流带给我们的便利,

除了这些简单的类,java.io中还有一些更复杂的子类.

复杂在哪里呢?比如下图三个reader,bufferedReader,FilterReader,InputStreamReader,这些Reader你在创建它们的时候,都需要在额外的传入一个reader才可以,也就是说,这三个reader的类,它们并不是自己独立生存的,它们好似是叠加在别的reader之上一起来作用的,即这三个reader在我们刚说的几个基本的类型reader之上,再提供了一些额外的功能,比如说BufferedReader它提供的额外的功能就是在额外的提供一个缓冲区,如果没有这个缓冲区,我们的应用进程每次要从原始的数据源里进行读取的操作,但是有时对原始的数据源进行频繁的读写操作是非常昂贵的操作,会消耗掉比较多的系统资源或者速度就比较慢,这时一个效率比较高的方法是给reader增加一个缓冲区,那么我们就可以从原始的数据源里多读一些数据,然后先放在我们的缓冲区里,我们的应用进程可以频繁的从缓冲区里进行读写,而不需要在原始的数据源里进行操作,缓冲区一般是在内存,所以效率会比较高(这句话好像有点问题,我又搜了一下)。

为什么使用缓冲效率高:https://blog.csdn.net/lsfor365/article/details/87005569

FilterReader在原有的reader之上可以增加一些额外的操作,比如说跳过字符流中的一些特定的字符不去处理,也可以在字符流中标记一些位置,然后读着读着跳回到之前的位置重新读。

刚才说过,处理字符流的叫做reader,处理字节流的叫做Inputstream,InputStreamReader是连接两种流的桥梁,它是把字节流转换成字符流类似这样的数据流,所以其比较常用的子类FileReader,因为对于一个File来讲,文件本身存储的最原始的基本数据就是一个字节一个字节,可是当我们读取文件内容的时候,我们不想再自己花时间实现字节到字符的转换,所以对于一个FileReader来讲,它从系统中读取的就是硬盘中的字节数据,我们想把读到的字节流转换成字符流,所以FileReaderader要继承将字节转换成字符的Reader。

对应的也有3中writer,具体与reader类似,创建此writer时也要传入基本的writer,作用与reader相反。

 

第三章 java.io 之字节流

字节流分为输入、输出字节流,最基本的字节流对于输入来讲就是ByteArrayInputStream和FileInputStream,在这里是从字节数组与文件中读数据,如果我们只是想把字节读取过来,用FileInputStream就可以了,就不需要之前的FileReader了。

对应的也有两种输出字节流,可以向字节数组和文件中输出内容。

 同样,字节流也有更复杂一些的字节流操作类。

FilterInputstream、FilterOutputstream与FilterReader、FilterWriter比较类似,它们也都是抽象类,创建它们时也都需要传入另外的字节流,它们可以在传入的字节流之上再添加一些额外的功能。

BufferedInputStream又和之前字符流中的BufferedReader非常像,都是在基本的InputStream上再为它添加一个缓冲区,这样减少对原本数据源低效率的操作,然而把操作转换到应用进程和缓冲区之间频繁的操作,从缓冲区里读效率更高。

DataInputStream与DataOutputStream配置使用,比如Java中一些基本的数据类型,int,double,long,char等等,可使用DataOutputStream来把这些基本类型变量输出出去,当DataOutputStream把这些基本类型写到输出流之后,对应的可以使用DataInputStream从输出的数据流中再把它们读进来,读进来的时候可以把它们直接转换成Java中的基本数据类型,也就是说DataInputStream解决了字节到基本类型的转换,比如说要读取char,DataInputStream就会从字节流中读取两个2个字节帮你转换成char。

 

第四章 java.io里的装饰器模式

前面基本上捋了一下java.io包里比较常见的处理io流的类,我们在讲解一些稍微高级些的流处理的类,比如说FilterReader、FilterInputStream,还有BufferedReader和BufferdInputStream时都说过,在创建这样的类时,它们不是独立存在的,而是在创建的时候要传入另外一个比较基本的,另外一个输入输出流的类,让它们在传入的类之上再额外添加一点功能,这种设计模式叫做装饰器模式。

如bufferedInputStream,在创建它时,可以看它的构造函数,你会看到它要求你再传入一个另外的InputStream,也就是说它可以为各种其他的继承了inputStream的类来提供这样的一个缓冲区,比如说可以传入FileInputStream,它是InputStream的子类,这样我们创建出的bufferedInputStream仍然是InputStream抽象类的一个子类,它有FileInputStream的所欲功能,还能使用缓冲区。

同样,也不只是装饰一种功能就结束了,我们装饰了缓冲区功能,还可以再装饰别的功能。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值