java基础之IO流

       写这篇文章之前准备了很多天,看了很多的博客,以一些博客的阐述为基础,自己看了java说明文档,又看了一些源码,可能自己理解的不是很透彻,但是还是决定记录下来,如果博客有幸被您看到,如果发现一些理解有错误或者是偏差,请您斧正,当然了,一些原理图我是从其他的一些博客和网上资料库里面得到的,如果被原作者看到,如感觉有冒犯,请您联系我,感谢!

       首先我们把整体思路捋一捋:下面这只是常用的一些而已,并不是全部。

       上面这个是IO集合中整体类图,按照流的类型分为了字符流和字节流来表达,但是在这儿之前,我们需要明确一点, I/O是怎么工作的,我们需要知道,这是一种阻塞式的。什么为阻塞式的呢?看下图:

       这个就意味着什么,意味着系统会一直有一个线程监听这个过程,直到提交完数据包,这个线程才会去执行其他任务,所以,假如数据量特别小并且数据提交不是很频繁的话,这其实是一种对线程资源的浪费,在高并发环境下,这样的表现的确 会比较挣扎,这也是为什么jdk在1.4之后会引入NIO的一个原因,NIO的非阻塞式I/O操作能够解决线程浪费的问题,不过可能大家不知道,线程池的出现其实也是解决线程浪费的一种方式,这种方法称为伪异步I/O,因为我们知道这种方式表面上实现了异步效果,本质上还是阻塞式的,只是对线程的操作灵活了一点而已。但是今天,我们还是乖乖来学习一下IO吧,要是以后有时间再来探讨一下NIO的东西。

       首先从整体上来分,我们可以分为三个部分:

  1. 流式部分:这个是主体部分。
  2. 非流式部分:包含一些辅助性质的类比如File类、RandomAccessFile类和FileDescriptor类。
  3. 其他类:文件读取部分和安全相关类,如:SerializablePermission类,以及与本地操作系统相关的文件系统的类,如:FileSystem类和Win32FileSystem类和WinNTFileSystem类。

       那我们先从流的数据类型上看:分为了字节流和字符流,但是我们需要知道字符流其实本质上也是字节流,因为计算机能识别的就是0和1,(准确来说,高低电位),只是为了方便,满足某种编码格式的特定数据,才出现了字符流这个概念。

       我们需要知道,在IO中,输入输出是两种不一样的流,分为输出流和输入流,输入流顾名思义就是输入,就是程序通过输入流从外界读取数据,是数据源到程序的通信通道。输出流恰好相反,是程序到数据源的通道。好了,那显而易见,根据流的流向      结合承载的数据类型,我们可以把流分成四类:

  1. 字符输入流(Reader)。
  2. 字符输出流(Writer)。
  3. 字节输入流(InputStream)。
  4. 字节输出流(OutputStream)。

     这是我们四种常用的流,这都已经被封装成了抽象类,下面还有很多子类,但是本质上是没有变化的,我们需要明确这一点,

 

      这是四个抽象类的一些具体子类,我们可以在使用时候拼接使用,比如用的最多的Buffer开头的(缓冲) 。这其中还体现了一个设计模式-----装饰者模式,如果有兴趣可以了解一下装饰者模式。

   主要的方法也就那么一些:

   InputStream和Reader:

 OutputStram和Writer

     这些方法会用,理解他们用法就行,但是建议可以的话看一下源码。

      下面我给大家一个小小的例子,就当时总结,这篇博客并没有涉及到很多的原理性东西。你可以将这个模块和线程(高并发)和网络编程(Socket)还有操作系统等一些知识串联起来想,会很有趣。

       

        好了,别的例子我就不举了,主要是给大家捋一下整个脉络,给自己一小点总结。如果要深入研究还得看源码源码呀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值