Java学习48-Java 流(Stream)、文件(File)和IO - 复习章节

1.File类的使用

  • File类的一个实例对应着磁盘上的文件或文件目录。
  • (必须熟悉)File的实例化(新建一个对象),常用的方法
  • File类中只有新建,删除,获取路径等方法,不包含读写文件的方法,此时需要使用使用下面说的IO流
  1. IO流的概述
  • IO流的分类(按不同方式有不同的分类,比如下面)

    • (按)流向(分类):输入流,输出流
    • (按)数据处理单位(分类): 字节流,字符流
    • (按)流的角色(分类):节点流,处理流
  • IO的四个抽象基类:InputStream\OutputStream\Reader\Writer(实际中具体使用的都是这四个基类的子类)

  1. 节点流之:文件流(上面那四个抽象基类前面加File关键字)
    FileInputStream \ FileOutputStream \ FileReader \ FileWriter

其中FileInputStream \ FileOutputStream可处理jpeg文件
FileReader \ FileWriter主要处理txt文件

(步骤)读/写数据的过程如下:

  • 步骤1:创建File类的对象,作为读取或写出数据的端点
  • 步骤2:创建相关的流的对象(并且将File对象作为参数传进去,读的时候必须真实存在,写的时候File对象其实可以不存在,系统会帮着创建)
  • 步骤3:读取/写出数据的过程
  • 步骤4:关闭流资源
  1. 处理流之一:缓冲流(上面那四个抽象基类前面加Buffered关键字)
  • BufferedInputStream \ BufferedOutputStream \ BufferedReader \ BufferedWriter
  • 作用:实现更高效的读写数据的操作
  1. 处理流之二:转换流(上面那四个抽象基两两拼接)
  • 层次1:熟悉转换流的使用
    InputStreamReader输入型的字节流转化成输出型的字符流
    OutputStreamWriter输入型的字符流转化成输出型的字节流
    回忆下图
    在这里插入图片描述

  • 层次2:(重点需要掌握)字符的编码和解码的过程,常用的字符集

    • 解决相关的问题: 读写字符出现乱码?本质原因为:使用的解码集和编码集不一致。
  1. 处理流之三:对象流(Object加四个抽象基类前两个Stream流)
  • 层次1:需要熟悉对象流的使用

    • ObjectInputStream:反序列化需要使用的API(再用这个从文件里解密出来)
    • ObjectOutputStream:序列化时候需要使用的API(先用这个写到文件里)
  • 层次2:对象的序列化机制

    • 使用场景:不同的进程之间通信,客户端(或浏览器端)与服务器端传输数据
    • 自定义类要想实现序列化机制需要满足的要求和注意点。

注意三个点
implements Serializable 实现Serializable接口
serialVersionUID 必须要自定义一个。
static int age; //如果定义为static,静态的,后续无法正常序列化,反序列化会得到null。
transient//如果定义为瞬态的,后续无法正常序列化,反序列化会得到null。

快速举例自定义的Person类

import java.io.Serializable;

/*
* 为什么要写implements Serializable?
* 如果不写,会出现错误:java.io.NotSerializableException: IOTest.Person
* 这个错误表示你尝试序列化一个类(在这个例子中是 IOTest.Person 类),
* 但是这个类没有实现 java.io.Serializable 接口。
* 在Java中,要序列化一个对象,该对象的类必须实现 Serializable 接口,
* 否则当你尝试将该对象写入到输出流(如 ObjectOutputStream)时,就会抛出 NotSerializableException 异常。
*
* 这类接口,就叫标识接口
* */
public class Person implements Serializable { //Serializable属于一个标识接口



    static final long serialVersionUID = 676600868485450L;
    // 上面的serialVersionUID可以随便写个数字,这个编码类似密码一样,注意一定要自己定义。
    // 如果自己不定义,系统会在后台帮你默认定义一个serialVersionUID编码,用于序列化+反序列化。
    // 这样很危险,因为一旦自定义类的代码被改写,系统就会重新生成一个新的serialVersionUID编码
    // 就会造成序列化用着一个“密码”,反序列化用着一个新的“密码”,运行起来就会直接报错。
    String name;
     static int age; //定义为static,静态的,无法正常序列化,等到反序列化则输出为null

     transient long id; //定义为transient,瞬态的,无法正常序列化,等到反序列化则输出为null

     Account acct ;

    public Person() {
    }
 public Person(String name, int age, long id) {
        this.name = name;
        this.age = age;
        this.id = id;
    }

    public Person(String name, int age, long id, Account acct) {
        this.name = name;
        this.age = age;
        this.id = id;
        this.acct = acct;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
         this.id = id;
     }



    static class Account implements Serializable {
        double balance;

        static final long serialVersionUID = 6766005450L;
        public Account(double balance) {
            this.balance = balance;
        }

        @Override
        public String toString() {
            return "Account{" +
                    "balance=" + balance +
                    '}';
        }
    }


   @Override
   public String toString() {
       return "Person{" +
               "name='" + name + '\'' +
               ", age=" + age +
               ", id=" + id +
               ", acct=" + acct +
               '}';
   }
}

使用时,调用Person类并构建对象,并赋值。 使用p2再解码解码出来。

 Person p1 = new Person("Ella",6, 60123);
        oos1.writeObject(p1);
        oos1.flush();

  Person p2 = (Person) ois1.readObject();
        System.out.println(p2);
        ois1.close();
  1. 其他流的使用
  • 了解:数据流 DataInputStream DataOutputStream
  • 了解:标准的输入流 System.in 标准的输出流 System.out
  • 了解:打印流:PrintStream PrintWriter
  • 安装第三方jar包的方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/629299.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STL 总结

STL 在 C 标准模板库(STL)中,主要包含了一系列的容器、迭代器、算法、函数对象、适配器。 容器 容器是用于存储数据的类模板。STL 容器可以分为序列型容器、关联型容器和链表型容器三类:序列型容器:vector、deque、…

XMind 头脑风暴/思维导图软件_V24.04.10291 PC高级版

一款风靡全球的头脑风暴和思维导图软件,为激发灵感和创意而生。在国内使用广泛,拥有强大的功能,包括思维管理,商务演示,与办公软件协同工作等功能。XMind中文版采用全球先进的Eclipse RCP软件架构,是集思维…

QT状态机8-使用恢复策略自动恢复属性

当状态分配的属性不再活动时,可能希望将其恢复到初始值,通过设置全局的恢复策略可以使状态机进入一个状态而不用明确制定属性的值。 QStateMachine machine; machine.setGlobalRestorePolicy(QStateMachine::RestoreProperties);当设置了恢复策略以后,状态机将自动恢复所有…

k8s pod就绪探针

Pod 可能需要时间来加载配置或数据,或者可能需要执行预热过程以防止第一个用户请求时间太长影响了用户体验。在这种情况下,不希望该 pod 立即开始接收请求,尤其是在运行的实例可以正确快速地处理请求的情况下。不要将请求转发到正在启动的 po…

第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组 数三角

//枚举顶点。 //不存在等边三角形 #include<bits/stdc.h> using namespace std; #define int long long const int n2e311; int a,b,c,l[n],r[n]; signed main() {ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>a;for(int i1;i<a;i){cin>>…

欢迎光临Java中的客“栈”

就目前而言&#xff0c;相信大家对数组、链表还有栈都基本已经有了一些了解&#xff0c;本篇文章将以栈为主体&#xff0c;探究栈和数组&#xff0c;栈和链表之间的一些联系。 当然在开始对栈的学习之前&#xff0c;我们先回顾有关数组、链表的基础知识点。 学习代码就是一个…

抛弃Elasticsearch ,MeiliSearch 从入门到入门,现在不精通

Elasticsearch 做为老牌搜索引擎&#xff0c;功能基本满足&#xff0c;但复杂&#xff0c;重量级&#xff0c;适合大数据量。 MeiliSearch 设计目标针对数据在 500GB 左右的搜索需求&#xff0c;极快&#xff0c;单文件&#xff0c;超轻量。 所以&#xff0c;对于中小型项目来说…

2024年,诺基亚手机发售仅一天就售罄

在智能手机越来越同质化的今天&#xff0c;各家都只卷性能和相机&#xff0c;大火的 AI 对于咱来说好像实用性又不太大&#xff0c;机圈属实整的有点儿无聊。 不过在阿红这两天上网冲浪的时候&#xff0c;一个陌生又熟悉的名字闯入了我的视线&#xff0c;——诺基亚&#xff08…

VMware Workstation 安装CentOS Linux操作系统

1.我们已经下载好VMware 创建新的虚拟机 2.选择典型 3.安装程序光盘映像文件 4.配置用户名密码 5.命名虚拟机&#xff0c;并确定位置 6.如图所示设置 7.等待&#xff08;时间会有点久&#xff09; 8.输入密码登入账号

##20 实现图像风格迁移:使用PyTorch深入学习的艺术之旅

文章目录 前言项目概述准备阶段图像处理模型选择风格和内容特征提取风格迁移算法优化过程结果展示完整代码与实验项目结论参考文献 前言 图像风格迁移是一种使一幅图像呈现另一幅画作风格的技术&#xff0c;通过深度学习&#xff0c;我们能够捕捉到内容图像的结构信息和风格图…

海外媒体发稿:如何在日本媒体投放新闻通稿-大舍传媒

导言 在全球化的时代背景下&#xff0c;海外媒体宣发对于企业来说非常重要。通过在海外媒体投放新闻通稿&#xff0c;企业能够拓展海外市场&#xff0c;增强知名度和影响力。本文将探讨如何在海外媒体投放新闻通稿&#xff0c;以帮助企业进行有效的海外宣传。 挖掘海外媒体资…

Java后端面试常见问题

Java后端面试 经历了两个月的面试和准备&#xff0c;下面对常见的八股文进行总结。有些问题是网上看到的面经里提到的&#xff0c;有些是我真实面试过程遇到的。 异常 1、异常分为哪几种&#xff1f;他们的父类是什么&#xff1f; 注意&#xff1a;所有异常对象的父类为Thr…

rocketmq的顺序消息开发注意事项

1. 参考消息重试&#xff0c;要对 MaxReconsumeTimes进行设置。之前就是因为没有进行设置&#xff0c;导致了队头阻塞问题。 rokcetmq和kafka一样&#xff0c;当顺序消息写入的多个队列中后&#xff0c;如果是顺序消息&#xff0c;当前的队列的队头一直消费失败的时候&#x…

2024 年 6 月 银行从业资格考试(银从)如何备考?

文章目录 一、考试介绍&#xff08;已了解的自行跳过此步骤&#xff09;&#xff08;一&#xff09;含金量&#xff08;二&#xff09;就业方向&#xff08;三&#xff09;适合人群&#xff08;四&#xff09;报考条件&#xff08;五&#xff09;题型分值&#xff08;六&#x…

新质生产力之工业互联网产业链

随着全球经济的数字化转型&#xff0c;新基建的概念逐渐成为推动工业发展的关键动力。在这一转型过程中&#xff0c;工业互联网作为新基建的核心组成部分&#xff0c;正逐渐塑造着未来工业的面貌。那么工业互联网产业链是如何构成的&#xff0c;以及它如何成为推动工业4.0和智能…

Linux服务器lvm磁盘管理fdisk和df磁盘大小不同修改

服务器端由于硬盘是通过VCenter原来100G磁盘复制的虚拟机,复制完成后,原来100G的磁盘通过选择 磁盘重新复制出150G的磁盘,开机后发现还是原来的100G的磁盘,通过fdisk -l 查看有个sdb是150G, 但是已经划转的lvm盘只有100G, 通过df查看也是原来的100G: pvs查看pv里也是10…

PMR-440N7Q韩国施耐德三和相序继电器EOCR-PMR

韩国施耐德三和EOCR继电器PMR-440N7Q PMR-440-N 直流电动机保护器:DCL、DOCR-S/H 欠电流继电器:EUCR-3C 交流电压继电器:EOVR、EVR-PD、EVR-FD、EUVR 韩国三和EOCR电动机保护器:EOCR-SS、EOCR-SS1/SS2、EOCR-AR、EOCR-ST、EOCR-SP、EOCR-SP1/SP2、EOCR-SE、EOCR-SE2/SE PMR-44…

电巢直播XR鉴赏|一块绿幕,闪现进入异星战争的现场!

XR场景赏析 在浩瀚的宇宙深处&#xff0c;一颗神秘莫测的异星球映入我们的眼帘&#xff0c;这里&#xff0c;龙卷风与炮火交织&#xff0c;似乎永不停歇。 星球表面散布着无数的飞船残骸&#xff0c;它们是某场宇宙大战残酷的遗存&#xff0c;无声地诉说着过往的激烈冲突。地面…

java spring 11 推断构造方法 createBeanInstance

1.doCreateBean方法&#xff1a;这一部分&#xff0c;用到createBeanInstance方法&#xff1a; BeanWrapper instanceWrapper null;if (mbd.isSingleton()) {// 有可能在本Bean创建之前&#xff0c;就有其他Bean把当前Bean给创建出来了&#xff08;比如依赖注入过程中&#xf…

汇舟问卷:5年专业经验,海外渠道查无需烦恼!

大家好&#xff0c;我是汇舟问卷&#xff0c;拥有五年的行业经验&#xff0c;专注于海外问卷渠道查。 在海外问卷渠道查领域&#xff0c;我们拥有专业的知识和经验。无需为购买大量海外邮箱而烦恼&#xff0c;更无需担忧账号被封禁的风险。我们提供全天候24小时的服务&#xf…