• File
    • File类的删除功能
    • File类的判断和获取功能
    • IO流的概述和分类
    • 字节流写数据
    • 字节流复制图片
    • 字节缓冲流
    • 字符流
    • 字符缓冲流
    • 标准输入输出流
    • 对象序列化
    • Properties 特殊操作流

    60cf5fb15d252b8011dc68d3dbcf94a.jpg

    eb0c22887fd6e49d790edeb8923d6a4.jpg
    image.png
    image.png

    image.png

    image.png

    image.png
    image.png

    image.png

    image.png
    刚刚创建的,java.txt

    image.png

    image.png

    image.png

    mkdirs() 创建多级目录
    image.png
    image.png
    image.png

    image.png

    image.png
    在已经存在javase.txt目录的情况下,创建javase.txt文件

    image.png

    image.png

    结果是false
    image.png

    因为我们已经存在javase.txt了,文件和目录都不能重名。


    File类的删除功能
    image.png
    image.png
    相对路径是从项目为起点开始查找的

    当我们在创建文件时,忘记标记目录。
    image.png

    image.png

    文件依然是能创建成功的。
    image.png

    找到f1的绝对路径
    image.png

    这里说明,项目是IDEA_Project
    image.png
    File的相对路径是从项目开始查找的,也就是从IDEA_Project开始查找的,只能看到JavaSE_Code和.idea两个文件夹。

    image.png

    image.png

    这是我们模块的位置。

    如果我想创建文件在模块下怎么操作呢

    image.png

    image.png

    删除文件
    image.png
    image.png


    File类的判断和获取功能

    image.png

    list()返回名字
    listFiles()返回对象。

    image.png
    image.png
    listFiles()返回文件对象。

    image.png
    image.png


    IO流的概述和分类

    image.png

    流的本质是数据传输,数据在设备间的传输称为流

    、、

    image.png

    image.png


    字节流写数据

    image.png

    创建OutputStream类给文件写入数据

    image.png

    image.png

    写入之后呈现的是输入数字的ASCII玛

    所有和IO相关的操作,最后都要释放资源。

    image.png


    字节流写数据的三种方式

    image.png

    image.png

    通过getBytes来写数据。

    追加写入:
    image.png

    image.png
    image.png
    在字节流处理中,close()语句是一定要执行的,所以我们要使用finally修饰符

    image.png

    image.png

    try中定义的语句finally中不一定会执行。因为try中的语句遇到异常之后就不会继续往下运行。


    字节流读数据

    image.png

    image.png

    字节流复制文本文件

    image.png

    image.png


    字节流读数据——一次读一个字节数组

    image.png

    fis.read(bys);以字节数组的形式读取。

    把文件中的数据读取到bys数组中。

    image.png

    image.png

    image.png

    如果没有内容了,那就返回-1


    字节流复制图片

    image.png

    image.png


    字节缓冲输出流

    image.png

    之前我们直接使用OutputStream的时候,这个类是向底层输出的字节流,是直接调用底层系统的。

    现在我们可以通过BufferedOutputStream来产生一个缓冲。

    image.png


    字符流

    image.png
    image.png
    image.png
    当我们读取字符的时候,一个中文相当于是两个到三个字节(根据不同的编码呈现不同的字节数)

    如果我们只是一个一个读取字节并输出,系统就会提示错误的结果。

    image.png

    一个汉字的存储
    如果是GBK编码,占用2个字节
    如果是UTF-8编码,占用3个字节

    image.png
    UTF-8编码

    image.png
    前面三 个 [-28,-72,083] 代表 中
    后面三个 [-27,-101,-67]代表 国

    image.png
    image.png

    当我们采用GDK编码的时候,就变成了两个字符了

    image.png


    编码表

    image.png

    image.png
    image.png

    image.png
    image.png

    image.png
    image.png

    image.png
    image.png
    image.pngimage.png


    字符流中的编码解码问题

    image.png

    image.png

    OutputStreamWriter的输入应该是字节输出流的对象

    字符输出流,是字节输出流和字符串的桥梁

    • InputStreamReader是从字节流到字符流的桥梁:它读取字节,并使用指定的charset将其解码为字符。它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

    image.png

    我们还可以在字节输出/输入流中指定charsetName就是字符集。

    image.png

    如果我们把字符集设计为GBK,那么我们再打开文件试试看。

    image.png
    image.png

    我们会发现,打开的文件不是我们想要的内容,那是因为,文件默认是用UTF-8解码的

    我们可以用InputStreamReader转化

    image.png
    image.png

    image.png


    字节流写数据的五种方式

    image.png

    image.png

    image.png

    我们可以看到文本文件中并没有输入内容

    这是因为,我们向OUtputStreamWriter写的内容只是暂时存放在缓冲区里的,我们还没有真正的通过字节流输入到文本文件中。

    这时候我们需要使用flush()方法去刷新缓冲区,把字节流输入到电脑之中

    image.png

    image.png

    close()方法自带刷新数据


    字符缓冲流

    image.png

    image.png

    image.png

    image.png
    image.png

    image.png

    image.png


    标准输入输出流

    image.png

    image.png

    image.png

    打印流

    image.png
    image.png

    image.png

    image.png

    字符打印流
    PrintWriter

    image.png

    image.png

    image.png

    image.png


    对象序列化

    image.png

    image.png

    image.png

    image.png

    image.png

    输出的值我们读不懂是因为我们还没有进行对象反序列化。

    对象反序列化流

    image.png
    image.pngimage.png

    image.png

    image.png

    在学生类的,toString 方法还没修改之前

    image.png

    image.png

    现在我们重写toString方法

    image.png

    image.png

    image.png
    再次运行的时候,我们发现报错了。

    注意哦,我们一定要注释掉write方法,不然是不会出问题的,因为每一次写write都会写一次UID进去

    Exception in thread “main” java.io.InvalidClassException
    com.itheima1.Student; local class incompatible:
    stream classdesc serialVersionUID = -6281151665433793349,
    local class serialVersionUID = -534666271653364536

    这里是因为修改了Student之后,UID变得跟之前不同了,所以我们会出现无效类异常。

    这里我们需要学习如何给类添加自定义的UID,这样就不会类似的情况了。

    • 序列化运行时与每个可序列化的类关联一个版本号,称为serialVersionUID,它在反序列化过程中使用,以验证序列化对象的发送者和接收者是否加载了与序列化兼容的对象的类。如果接收者已经为具有与对应发件人类别不同的serialVersionUID的对象加载了一个类,则反序列化将导致一个InvalidClassException 。一个可序列化的类可以通过声明一个名为”serialVersionUID”的字段来显式地声明它自己的serialVersionUID,该字段必须是static,final和long类型: ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L; 如果可序列化类没有显式声明serialVersionUID,则序列化运行时将根据Java(TM)对象序列化规范中所述的类的各个方面计算该类的默认serialVersionUID值。然而, 强烈建议所有可序列化的类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类细节非常敏感,这些细节可能因编译器实现而异,因此可能会在反序列化期间导致意外的InvalidClassException 。

    image.png

    我们现在在学生类中加入

    serialVersionUID的值,现在我们再看一下。

    image.png

    复制SerialVersionUID之后,我们就可以读取文件了。


    Properties
    image.png

    image.png

    image.png

    image.png

    image.png