Java IO流

一、文件基础知识

1.文件流

    文件在程序中是以流的形式来操作的。
    
流:数据在数据源(文件)和程序(内存)之间经历的路径。
输入流:数据从数据源(文件)到程序(内存)的路径。
输出流:数据从程序(内存)到数据源(文件)的路径。
继承关系图:

2.常用文件操作

①创建文件
    new File(String pathname)//根据路径创建一个File对象。
    new File(File parent, String child)//根据父目录文件+子路径构建
    new File(String Parent, String child)//根据父目录+子路径构建
    File.createNewFile()//创建新文件。
②获取文件信息(常用信息)
    getName()    返回由此抽象路径名表示的文件或目录的名称。
    getAbsolutePath()    获取绝对路径
    getParent()    获取父级目录
    length()    获取文件大小(字节)
    exists()    文件是否存在
    isFile()    是否为文件
    isDirectory()    是否为目录
③目录操作
    mkdir()    创建一级目录
    mkdirs()    创建多级目录
    delete()    删除空目录或文件

3.IO流原理及流的分类

IO流原理:
    ①I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理数据传输。
    ②Java程序中,对于数据的输入/输出操作以“流(stream)”的方式进行。
    ③Java.io包下提供各种“流”类和接口,用以获取不同种类的数据,并通过方法输入或输出数据。
流的分类:
    ①按操作数据单位不同分为:字节流(8 bit),字符流(按字符)
    ②按数据流的流向不同:输入流、输出流
    ③按流的角色不同分为:节点流,处理流\包装流
抽象基类
字节流
字符流
输入流
InputStream
Reader
输出流
OutputStream
Writer
    Java的IO流共涉及40多个类,都是由如上4个抽基类派生出来的。

二、节点流

1、字节输入流-InputStream

    该抽象类是所有类字节输入流的超类。

1.常用子类

    ①FileInputStream:文件输入流

    ②BufferedInputStream:缓冲字节输入流

    ③ObjectInputStream:对象字节输入流

2.FileInputStream:

构造方法:

方法:

2、字节输出流-OutputStream:

    该抽象类是所有类字节输入流的超类。

  

1.常用子类

    ①FileOutputStream:文件输出流

    ②BufferedOutputStream:缓冲字节输出流

    ③ObjectOutputStream:对象字节输出流

2.FileOutputStream

构造方法:

方法:

3、字符输入流-Reader

    按照字符输入。

1.常用子类

①FileReader:实际使用类

②InputStreamReader:字节流和字符流的桥接器。

    Java中的InputStreamReader类是由InputStream类实现的。

    InputStreamReader类是一个字符流读取器,它通过使用默认或指定的字符集将字节流转换为字符流。

        它通过InputStream类来实现该功能,InputStream提供了读取字节的基本功能,而InputStreamReader则在此基础上实现了读取字符的功能。

        InputStreamReader类是一个装饰器,它通过在InputStream上添加字符解码功能来扩展InputStream。

        InputStreamReader类可以指定字符集,在读取文件时可以避免乱码问题。

    所以InputStreamReader是由InputStream实现的,它是一个字符流读取器,可以将字节流转换为字符流。

③BufferedReader:处理流

2.FileReader

构造方法:

方法:

    其自身没有普通方法,相关方法均来自继承的父类:

    read():每次读取单个字符,返回该字符,如果到达文件末尾返回-1.

    read(byte[]):批量读取多个字符,返回读取到的字符数,到文件末尾返回-1.

4、字符输出流-Writer

1.常用子类

①FileWriter:实际使用类

②OutputStreamWriter:字节流和字符流的桥接器

    Java中的OutputStreamWriter类是一种字符流写入器,它通过使用默认或指定的字符集将字符流转换为字节流。

    它通过OutputStream类来实现该功能。OutputStreamWriter 类可以将文本内容写入 OutputStream 中。

    它是一个装饰器,它在 OutputStream 上添加了字符编码功能。OutputStreamWriter类可以指定字符集编码,在写文件时可以避免乱码问题。

    所以OutputStreamWriter是由OutputStream实现的,它是一个字符流写入器,可以将字符流转换为字节流。

③BufferedWriter:

2.FileWriter

构造方法:

方法:

  其自身没有普通方法,相关方法均来自继承的父类:

    writer():写入单个字符

    writer(char[]):写入指定字符

    ...

    在写入完毕之后,必须使用close()或flush()方法,否则无法写入。

        close()=flush() +关闭。

    即flush()才是真正写入文件。

三、处理流

处理流:

1、节点流和处理流

1.节点流:

    从一个特定的数据源读写数据,如FileReader、FileWriter。

    (也就是说,直接对某个数据源进行操作,比如把其当作二进制FileInputStream,字符FileReader,

    数组ByteArrayInputStream等,不进行过多的操作封装) 

2.处理流(包装流):

    是连接在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,例如BufferedReader,BufferedWriter。

3.二者区别:

    ①节点流是底层流\低级流,直接和数据源有关。

    ②处理流包装节点流,既可以消除不同节点流之间的差异,也可以提供更方便的方法来完成输入输出。

    ③处理流对节点进行包装,使用了 处理流设计模式——修饰器模式,不会直接与数据源相连。

处理流优势:

    ①性能的提高:主要以增加缓冲的方式提高输入输出效率。

    ②操作的便捷:处理流提供了一系列便捷的方法来一次输入大批量数据,使用起来更加灵活。

接下来分别介绍三种处理流:字符处理流、字节处理流、对象处理流

2、Buffered字符处理流

    以下讲解最常见两种处理流BufferedReader和BufferedWriter,二者属于字符流。

1、BufferedReader

    继承关系图:

1.属于字符流,按照字符来读取数据。

2.关闭处理流时,只需关闭外层流即可。(因为真正工作的还是节点流)

方法:

    例如其中方法readLine()方法就是一个扩展方法。

为何只需关闭外部流即可:

1.可见该类有个属性in,用来存储字符流子类对象。 

2.查看其close()方法:

    直接调用了in.close(),说明自动调用了低一层的关闭方法。

2、BufferedWriter

继承关系图:

常用方法:

3、Buffered字节处理流

    常用的为BufferedInputStream和BufferedOutputStream.

1.BufferedInputStream

    继承关系图:

    其父类FilterInputStream中也有一个属性为in:

    作用与上述字符流一样。

常用方法:

BufferedOutputStream与这个类似。

4、对象处理流

    常用的为ObjectInputStream和ObjectOutputStream.

引出对象处理流:

    需要将基本数据类型或对象进行序列化和反序列化操作。

序列化和反序列化:

    1.序列化就是在保存数据时,保存数据的值和数据类型。

    2.反序列化就是在恢复数据时,恢复数据的值和数据类型。

    3.需要让某个对象支持序列化机制,则必须让其类时可序列化的。为了让某个类是可序列化的,该类必须实现如下两个接口之一:

        ①Serializable(这是一个标记接口,没有方法)

        ②Externalizable(该接口继承了Serializable,其有两个方法)

继承关系图:

    可见,根据其构造器,ObjectInputStream类也使用了修饰器模式。

    ObjectOutputStream类似。

 常用方法:

    注意,序列化之后,保存的文件格式不是存文本。

注意事项:

1.读写顺序要一致,读取(反序列化)顺序需要和保存数据(序列化)顺序一致。

2.要求序列化或者反序列化的对象,需要实现上述的两个接口。

3.序列化的类中减一添加SerialVersionUID,为了提高版本的兼容性(即如果在类中添加了新的属性等,不会被认为是一个新的类)。

4.序列化对象,默认将除了static或transient修饰的属性以外的所有属性序列化

5.序列化对象时,要求该类里面属性的类型也实现序列化接口

6.序列化具备可继承性,如果某类实现了序列化,则它的所有子类也默认实现序列化。

四、IO流——标准输入输出流、转换流、打印流、配置文件

1、标准输入输出流

编译类型
实际类型
默认设备
System.in 标准输入
InputStream
BufferedInputStream
键盘
System.out 标准输出
PrintStream
PrintStream
显示器
可见,标准输入输出流都是System类的一个属性。

2、转换流

    作用就是将字节流和字符流进行转换。
转换流:
    InputStreamReader和OutputStreamWriter
继承关系图:
1. InputStreamReader是Reader的子类,可以将InputStream(字节流)包装成(转换)Reader(字符流).
2. OutputStreamWriter是Writer的子类,可以将OutputStream(字节流)包装成(转换)Writer(字符流)。
3.当处理纯文本数据时,使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换为字符流。

3、打印流

打印流:
    PrintStream和PrintWriter
    打印流只有输出流,没有输出流吧。
1. PrintStream字节打印流
继承关系图:
    
    常用的System.out就是PrintStream类型的。
注意:
    1.常用的System.out.print()中print:
        可见其最终是使用write()方法进行输出,也可以直接调用writer()进行打印。
        
    2.System.out(PrintStream类对象)默认输出位置为屏幕,可以进行修改。
        直接使用System.setOut(PrintStream类对象);
        
        其中的checkIO()和setOut0()都是native本地方法。
2.PrintWriter字符打印流
继承关系图:    
    
System.out属性为final static,且其赋值为null,为何还能赋值给PrintWriter等。
    

4、配置文件Properties

继承关系图:
    其底层就是使用的Hashtable。 
    
构造方法:
    
常用方法:
1.load:加载配置文件的键值对到Properties对象。
2.list:将数据显示到指定设备。
3.getProperty(key):根据键获取值
4.serProperty(key,value):设置到键值对到Properties对象
5.store:将properties中的键值对存储到配置文件,在idea中,保存信息到配置文件,如果含有中文,会存储为unicode码。
  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值