大家好,我是修真院武汉分院15期java学员,今天我给大家分享-------IO流简单介绍
1.背景介绍
2.知识剖析
3.常见问题
4.编码实战
5.扩展思考
6.参考文献
7.更多讨论
1.背景介绍
Java中I/O流是一种计算机用语。而I/O问题可以说是Web应用中所面临的主要问题之一,因为在这个海量数据时代,数据在网络中随处流动。这个流动都涉及到I/O问题,可以说大部分Web应用系统的瓶颈都是I/O瓶颈。
I/O问题是任何编程语言都无法回避的问题,可以说I/O问题是整个人机交互的核心问题,因为I/O是机器获取和交换信息的主要渠道。在这个数据爆炸的时代,I/O问题尤其突出。
2.知识剖析
IO流的三种分类方式
1.按流的方向分为:输入流和输出流
2.按流的数据单位不同分为:字节流和字符流
3.按流的功能不同分为:节点流和处理流
IO流的四大抽象类
字符流:Reader Write
字节流:InputStream OutputStream
输入流:InputStream 它的作用是用来表示那些从不同数据源产生输入的类,这些数据源包括:
1)字节数组
2)String对象
3)文件对象
4)“管道”,工作方式与实际生活中的管道类似,即从一端输入,从另一端输出
5)由其它种类的流组成的序列,以便我们可以将它们收集合并到一个流内
6)其它数据源,如Internet连接等
每种数据源都有对应的InputStream子类,还有一种单独的FileInputStream也是属于一种InputStream
输出流:OutputStream 它决定输出所要去的目标:
1)字节数组
2)文件对象
3)管道
输出目标也有对应的子类
Reader和Writer(字符输入和输出流)
java 1.1对基本的IO流类库进行了重大的修改,当中最大的改动就是出现了Reader和Writer类。这两个类不是用来替代InputStream和OutputStream的,而是提供Unicode和面向字符的IO功能,也就是现在我们说的字符流。它的继承层次结构主要是为了国际化,而且在此之前的io流不能很好的处理16位的Unicode字符,在我们需要字符和字节结合起来使用的时候很不方便,它们也可以通过适配器(InputStreamReader/OutputStreamWriter)和InputStream/OutputStream互相转换。
而Java中的字符是Unicode是双字节的,InputStream是用来处理字节,并不适合处理字符串文本,所以在处理字符上应该尽量使用它们。
输出流:OutputStream 它决定输出所要去的目标:
1)字节数组
2)文件对象
3)管道
输出目标也有对应的子类
Reader和Writer(字符输入和输出流)
java 1.1对基本的IO流类库进行了重大的修改,当中最大的改动就是出现了Reader和Writer类。这两个类不是用来替代InputStream和OutputStream的,而是提供Unicode和面向字符的IO功能,也就是现在我们说的字符流。它的继承层次结构主要是为了国际化,而且在此之前的io流不能很好的处理16位的Unicode字符,在我们需要字符和字节结合起来使用的时候很不方便,它们也可以通过适配器(InputStreamReader/OutputStreamWriter)和InputStream/OutputStream互相转换。
而Java中的字符是Unicode是双字节的,InputStream是用来处理字节,并不适合处理字符串文本,所以在处理字符上应该尽量使用它们。
缓存流
BufferedInputStream和BufferedOutputStream
BufferedReader和BufferedWriter
缓存是IO的一种性能优化。缓存流为IO流增加了内存缓存区,大大增加了流的执行效率
缓存流本身不具IO功能,只是在别的流上加上缓冲提高效率,像是为别的流装上一种包装。在对文件或其他目标频繁读写或操作的时候可能效率低、效能差,这时候使用缓冲流可以更高效的读写信息。因为缓冲流先将数据缓存起来,然后一起写入或读取出来。所以说,缓冲流还是很重要的,在IO操作时记得加上缓冲流提升性能。
3.常见问题
字符流和字节流的区别
字节流操作的基本单元为字节(8bit),可以通过字节操作所有数据;字符流操作的基本单元为Unicode码元,只能处理字符类 数据。
字节流默认不使用缓冲区;字符流使用缓冲区。
字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。
socket是什么,怎样与别的网络进行通信?
一台计算机要和另一台计算机进行通讯,获取其上应用程序的数据,必须通过Socket建立连接,要知道对方的IP和端口号。建立一个Socket连接需要通过底层TCP/IP协议来建立TCP连接,而建立TCP连接必须通过底层IP协议根据给定的IP在网络中找到目标主机。目标计算机上可能跑着多个应用,所以我们必须要根据端口号来制定目标应用程序,这样就可以通过一个 Socket 实例唯一代表一个主机上的一个应用程序的通信链路了。
4.编码实战
5.扩展思考
I/O传输过程中的阻塞问题,传输时间长,访问磁盘次数过多。
通常提升磁盘I/O性能的方法有:
1:增加缓存,减少磁盘访问次数
2:优化磁盘的管理系统,设计最优的磁盘方式策略。这是在底层操作系统层面考虑的。
3:设计合理的磁盘存储数据块,以及访问这些数据块的策略。这是在应用层考虑的。可以给存放的数据设计索引,通过寻址输索引来加快和减少磁盘的访问量,还可以使用异步和非阻塞的方式加快磁盘的访问次数。
6.参考文献
JAVA编程思想
JAVA从入门到精通(第四版)
百度:JAVA IO流