IO流学习笔记

IO流学习笔记

1、IO流概述

  • 流的概念:

    java中流是个抽象的概念,当java程序需要从某个数据源(内存,文件,网络等都可以是数据源)读取数据时,或者像某个数据源写入数据时,就会打开一个数据流。IO流是有起点,有终点的有序字节数列。简单的说,IO流就是以流的方式进行输入输出,通过IO流可以完成对硬盘文件的读和写。

    所有的流都实现了java.io.closeable接口都有一个close方法,都是可关闭的,所有的流在被使用完后都需要调用close方法来关闭,以此来避免资源的浪费!

  • IO流分类:

    依据流的方向分为:I 是输入流 InputStream 和 O 是输出流OutputStream(输入和输出是相对于内存而言的,即输入是往内存中输入数据,也就是程序读取数据。输出是从内存往硬盘中写入数据)所有的输出流都实现了java.io.flushable接口,都有flush方法。

    依据流中读取数据的单位不同可分为:字节流和字符流

    依据处理方式可分为:节点流和处理流

    节点流:可以从或向一个特定的方向(节点)读写数据的流即为节点流,例如FileInputStream,FileOutputStream等

    处理流:是对一个已经存在的流进行的连接和封装,即为对一个节点流进行包装的流为处理流,例如BufferedReader,BufferedWriter等

    这个类以Stream单词结尾就是字节流,如果以reader结尾就是字符输入流,以writer结尾就是字符输出流

2、字节流

有的IO流是以字节为单位读取的数据的,这种流称为字节流。字节流每次读取一个字节的数据,既1byte数据(即八个二进制),字节流可以读取任意类型(文本文件、图片、视频、音频等文件)的文件。字节流通常以Stream这个单词为结尾

  • 字节输入流

    字节输入流的父类是InputStream,其中常用的子类有:

    1、 FileInputStream把一个文件作为InputStream,实现对文件的读取操作
    2、 ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
    3、StringBufferInputStream:把一个String对象作为InputStream

  • 字节输出流

    字节输出流的父类是OutputStream,其中常用的子类有:

    1、FileOutputStream把一个文件作为InputStream,实现对文件的写入操作 。

    2、ByteArrayOutputStream:把内存中的一个缓冲区作为OutputStream使用

  • 常用的方法

    1、available( ):返回从该输入流中可以读取的字节数的估计值,可以用于创建字节数组,可以不需要使用循环,但是使用available方法时需要斟酌使用,因为数组的大小有限,当文件过大时会产生问题!

    2、skip( ):跳过几个字节不读取

    3、flush():通常在写入文件之后调用一下,将数据全部写入文件中

3、字符流

以字符为处理数据的单位的流为字符流,每次读取一个字符。这种流是为了方便读取普通文本文件(扩展名为.txt的文件)而存在的,只能读取纯文本文件,不能读取图片,视频,音频等文件。通常以Writer单词为结尾的流为字符输出流,以Reader单位为结尾的流为字符输入流。

  • 字符输入流,父类为Reader

    子类有CharArrayReader,FileReader,BufferedReader,FilterReader,PipedReader,StringReader

  • 字符输出流,父类为Writer

    子类有CharArrayWriter,FileWriter,BufferedWriter,FilterWriter,PipedWriter,StringWriter,PrintWriter

4、缓冲流

使用缓冲流时,不需要自定义字节或字符数组,缓冲流自带有缓冲区。缓冲流是包装流,关闭流时,只需要关闭外层的流,内部的流会自动关闭。

  • java.io.BufferedReader

    带有缓冲区的字符输入流

  • java.io.BufferedWriter

    带有缓冲区的字符输出流

  • java.io.BufferedInputStream

    带有缓冲区的字节输入流

  • java.io.BufferedOutputStream

    带有缓冲区的字节输出流

5、转换流

通过转换流可以将字节流转换为字符流

  • java.io.InputStreamReader

    将字节输入流转换为字符输入流

  • java.io.OutputStreamWriter

    将字节输出流转换为字符输出流

6、标准输出流(打印流)

标准的输出流,默认输出到控制台,但是可以设置标准输出流的输出方向(调用setOut方法)。不需要手动调用close方法去关闭

  • java.io.PrintWriter

  • java.io.PrintStream

7、对象的序列化与反序列化

  • java.io.ObjectInputStream

    java对象的反序列化:DeSerialize,将硬盘上的数据重新读取到java内存中,回复成java对象

    当反序列化多个对象时,返回的是一个集合。

  • java.io.ObjectOutputStream

    java对象的序列化:Serialize,将java文件保存到文件中,将java对象的状态保存到文件中

    如果需要序列化多个对象,可以将多个对象放入集合中,然后序列化集合。

    如果想实现对象的序列化,需要让对象实现Serializable接口,这个接口不是普通接口,而是标志接口,这个接口中没有任何内容,他是给java虚拟机参考的,java虚拟机识别这个标志接口后,会自动生成一个序列化版本号(尽量手写而不要自动生成)。序列化版本号是用来区分不同的类的标识。

8、数据流

数据流可以将数据连同数据的类型一起写到文件中,写入的文件不是纯文本文件。

使用DataOutputStream写入的数据只能通过DataInputStream读取

  • java.io.DataOutputStream
    的标识。

8、数据流

数据流可以将数据连同数据的类型一起写到文件中,写入的文件不是纯文本文件。

使用DataOutputStream写入的数据只能通过DataInputStream读取

  • java.io.DataOutputStream
  • java.io.DataInputStream
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值