Java之IO流详解

        在qq群交流中,发现有部分人再咨询IO流方面的知识,个人觉得新手问的最多,本来对于刚接触IO流的学者来说,还是比较难理解,但是这方面的知识,必须得掌握,所以总结如下:

一、功能

        流就是字节序列的抽象概念,能被连续读取数据的数据源和能被连续写入数据的接收端就是流,流机制是Java及C++中的一个重要机制,通过流我们可以自由地控制文件、内存、IO设备等数据的流向。而IO流就是用于处理设备上的数据,如:硬盘、内存、键盘录入等。是不是难理解,那你就这么理解,IO流用能把数据从一个地方搬移到另一个地方,比如说项目中向服务器上传视频,那就把视频以流水形式,从本机流到服务器呗。不多说,看分类

二、分类

1、字节流(抽象基类为InPutStream和OutPutStream)和字符流(抽象基类为Reader和Writer)——根据处理数据的数据类型分类;

区别:

    字节流读取的时候,读到一个字节就返回一个字节;字符流使用了字节流读到一个或多个字节(中文对应的字节数是李娜哥哥,在UTF-8码表中是3个字节)时,首先去查指定的编码表,将插到的字符返回。

    字节流可以处理所有类型的数据,如视频、音频、图片、文本等等,而字符流只能处理字符数据,只要是处理纯文本数据,就要优先考虑使用字符流,如果用字节流,返回的都是乱码。

2、输入流和输出流——根据流向不同,两者区别一个读(输入流,读到内存中)一个写(输出流,输出到硬盘);

三、IO流主要分节点流和处理流

根据是否从数据源头处理数据分类的,掌握了节点流和处理流,那么也就掌握了IO流

1、节点流——从一个特定的地方读写数据,主要分类如下表,根据项目中使用情况,主要掌握第一种File类型,是最常用的,其他的暂时做个了解就行。节点流,比如说,在水箱上安装了一个水管,现在水流到水管子中了,为了提高水流速度,又有研发了一种水管,接在刚才那个水管上,让水流速度更快,所以就这个新水管好比处理流,处理流诞生了

类型字符流字节流
File(文件)
FileReader
FileWriter
FileInputStream
FileOutputSream
Memory Array
CharArrayReader
CharArrayWriter
ByteArrayInputStream
ByteArrayOutputSream
Memory String
StringReader
StringWriter
   -
Pipe(管道)
PipedReader
PipedWriter
PipedInputSream
PipedOutputSream
2、处理流,处理流是对已有流的封装和连接,通过所封装流的功能实现数据的读写,处理流的构造方法必须以其他流为参数,一个流通过其他流的处理,那就是链接。好比这个管子没法直接接到水箱上,只能接到那个节点流的管子上喽。为了提高处理数据的效率,所以设计了好几种处理流

(1)、缓冲流(BufferInputStream/BufferOutputStream、BufferReader/BufferWriter),通过缓冲提高读写数据效率,例如读写一段纯文本,处理纯文本,只能用字符流。

读取缓冲区对象

FileReader fr=new FileReader("读入文件的路径");
BufferReader br=new BufferReader(fr);
写入缓冲区对象
BufferWriter bw=new BufferWriter(new FileWriter("写入文件的路径"));
缓冲流有个很好用的地方readLine(),一次读一行,每次读取到一个字符,暂时不做处理,先做临时存储,等一行读完,一次返回,大大提高了读的速度。

(2)、转换流(InputStreamReader/OutputStreamWriter)
将字节流转为字符流,是字节流与字符流之间的桥梁,使原本毫无关联的两种流操作能够进行转化,提高了程序的灵活性。

(3)、数据流(DataInputStream/DataOutputStream

该数据流可以方便的对一些基本数据类型数据直接进行存储和写入,不需要再进一步进行转换,通常只要操作基本数据类型的数据,就需要通过DataStream进行包装。

(4)、打印流(PrintStream/PrintWriter)

         PrintStream是一个字节打印流,System.out对应的类型就是PrintStream,它的构造函数可以接受三种数据类型的值:1.字符串路径。2.File对象 3.OutputStream

         PrintWriter是一个字符打印流,它的构造函数可以接受四种类型的值:1.字符串路径。2.File对象 3.OutputStream  4.Writer  对于1、2类型的数据,可以指定编码表,也就是字符集,对于3、4类型的数据,可以指定自动刷新,当该自动刷新为True时,只有3个方法可以用:println,printf,format。

 (5)、对象流(ObjectInputStream/ObjectOutputStream),该类型的流可以把类作为一个整体进行存取,主要方法有:
        Object readObject();该方法抛出异常:ClassNotFountException。
        void writeObject(Object):被写入的对象必须实现一个接口:Serializable,否则就会抛出:NotSerializableException
最后用一张表做总结:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值