博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java IO流-学习整理汇总
阅读量:5805 次
发布时间:2019-06-18

本文共 2441 字,大约阅读时间需要 8 分钟。

hot3.png

java IO流

    1:概念

        java中的流,他的概念源于unix中管道(pipe)的概念,在unix中,管道是一条不间断的字节流,用于实现程序或者进程之间的通信,或者读写外围设备,外围文件等。

    2:分类

        输入输出流:根据文件流的流向,分为输入流和输出流,

        字节流和字符流:针对处理的对象是字符还是字节,分为字符流和字节流,

            字节流:一般读入或读出的是8位二进制数据,InputStream是所有字节输入流的祖先,OutPutStream是所有输出流的祖先。

            字符流:一般读入或读出的是16位二进制数据,Reader是所有读取字符输入流的祖先,Writer是所有字符输出流的祖先。

            结合上面所说的输入输出流,简单分类,

                                    字符流                         字节流

            输入流            Reader                    InputStream

            输出流            Writer                     OutPutStream

        节点流和处理流:节点流是在程序中直接和源文件相连,读入或者读出,处理流就是与节点流一块使用,在节点流的基础上再套上一层,套上的就是处理流

        其中需要注意的是在平常操作中如何判断使用字符流还是字节流,字符流一般都是读入或者读出的单位是一个字符,一般遇到中文的就用字符流,因为中文一个字节装不下,如果采用字节流,那么读入的将会是半个中文,操作系统不认识,只能显示问号,遇到其他图片,媒体,视频等就用字节流。通俗点就是遇到中文的就用字符流,其他字节流。

3:详解:

    17131021_SJ0R.jpg

上面图是一个简单表关系,是上次从别人那看到不错就粘贴过来了,很形象。下面就java中的字节流和字符流进行简单的介绍:

java 中的字节流:

        FileInputStream和FileOutPutStream

         他们都是节点流,input流的源端和out的目的端都是磁盘文件,他们的构造方法允许通过文件的路径名来构造相应的流

          FileInputStream fis = new FileInputStream("c://123.txt");要注意的是123.txt文件必须存在而且要保证是可读的。

          FileOutPutStream fos = new FileOutPutStream("c://345.txt");若输出文件已经存在了,那么必须是可以覆盖的,如果不存在,则会创建。

        BufferedInputStream和BufferedOutputStream,他们是带有缓冲区的input和output,他们分别继承了FileInputStream和FileOutPutStream,

java中的字符流:

        字符流是主要用来处理字符的,java采用16位的Unicode来表示字符串和字符,对应的字符流的输入和输出分别是Reader和Writer,

    其中FileReader和FileWriter分别继承了Reader和Writer,属于节点流

    其中InputStreamReader和InputStreamWtirer,他们是处理流,协助节点流进行处理,在构造这两个类的对应流时,他们会自动进行转换,将平台缺省的编码格式设置为Unicode编码格式,对英文环境而言,缺省编码格式为ISO8859-1。

    BufferedReader和BufferedWriter两个类对应的流使用了缓冲,能大大提高输入输出的效率。他也是处理流。

其余还有很多对象,那些都是衍生出来的,针对数组,管道和对象操作的这里就没有详谈。

使用规则:

    下面简单介绍一下在那种情况下使用那种流

1:根据文件:

    文件:FileInputStream,FileOutPutStream(字节流),FileReader,FileWriter(字符流,带中文)

    byte[]:ByteArrayInputStream,ByteArrayOutPutStream(字节流)

    char[]:CharArrayReader,CharArrayWriter(字符流)

    String:StringBufferInputStream,StringBufferOutPutStream(字节流),StringWriter,StringReader(字符流)

    网络数据流:InputStream,OutPutStream(字符流),Reader,Writer(字符流)

2:按是否格式化输出区分:

    要格式化输出:PrintStream,PrintWriter

3:按是否缓存区分:

    BufferedInputStream,BufferedOutPutStream(字节流),BufferedReader,BufferWriter(字符流)

4:按照数据格式区分

    二进制格式(只要不能确定是纯文本格式的)InputStream,OutPutStream以及Stream的子类

    纯文本格式(含英文以及中文或者其他编码格式)Reader,Wrtiter以及Reader,Writer的子类

5:输入输出区分

    输入流:Reader,InputStream的子类

    输出流:Writer,OutPutStream的子类

6:特殊需求区分:

    从stream到Reader,Writer的转换类:InputStreamReader,OutPutStreamReader

    对象输入输出:ObjectInputStream,ObjectOutPutStream

    进程之间通信:PipeInputStream,PipeOutPutStream,PipeWriter,PipeReader

    序列化的:SequenceInputStream

决定选取那种类以及他的构造进程规则一般如下:

首先考虑原始数据格式

其次考虑是输入还是输出

在这考虑是否需要转换流

还要考虑数据去向

考虑是否需要缓冲

以上只是我自己结合网上的一些整理的,如果有什么不妥或者错误的地方,敬请指出,谢谢。

转载于:https://my.oschina.net/u/1034481/blog/546704

你可能感兴趣的文章
CentOS 7 装vim遇到的问题和解决方法
查看>>
JavaScript基础教程1-20160612
查看>>
使用第三方类、库需要注意的正则类RegexKitLite的使用
查看>>
iOS \U7ea2 乱码 转换
查看>>
FCN图像分割
查看>>
ios xmpp demo
查看>>
设计模式之-工厂模式、构造函数模式
查看>>
python matplotlib 中文显示参数设置
查看>>
数据库事务隔离级别
查看>>
os模块大全详情
查看>>
【ros】Create a ROS package:package dependencies报错
查看>>
从内积的观点来看线性方程组
查看>>
kali linux 更新问题
查看>>
HDU1576 A/B【扩展欧几里得算法】
查看>>
廖雪峰javascript教程学习记录
查看>>
WebApi系列~目录
查看>>
限制CheckBoxList控件只能单选
查看>>
Java访问文件夹中文件的递归遍历代码Demo
查看>>
项目笔记:测试类的编写
查看>>
如何迅速分析出系统CPU的瓶颈在哪里?
查看>>