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,静态的,无法正常序列化,等到反序列化则输出为nulltransient long id; //定义为transient,瞬态的,无法正常序列化,等到反序列化则输出为nullAccount 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;}@Overridepublic String toString() {return "Account{" +"balance=" + balance +'}';}}@Overridepublic 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包的方法

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法练习第22天|39. 组合总和、40.组合总和II

39. 组合总和 39. 组合总和 - 力扣(LeetCode)https://leetcode.cn/problems/combination-sum/description/ 题目描述: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数…

docker镜像中搭建FastDfs

docker镜像中搭建FastDfs 一、搭建过程二、docker端口映射三、映射的方法三、配置Tracker 和 Storage 环境:腾讯云服务器上 ubuntu20.04镜像 一、搭建过程 正常直接在云服务器上搭建过程参考博客: https://blog.csdn.net/qq_38531706/article/details/…

[笔试训练](二十三)067:打怪068:字符串分类069:城市群数量

目录 067:打怪 068:字符串分类 069:城市群数量 067:打怪 题目链接:打怪 (nowcoder.com) 题目: 题解: 直接计算结果: 1.一只怪物能抗几次攻击 int m(H/a)(H%a0?0:1); 2.杀死一只怪物,玩家要抗几次攻击 int nm-1; *3.杀死一只…

嵌入式学习72-复习(字符设备驱动框架)

编辑 drivers/char/Kconfig 为了在make menuconfig是能够显示出我们写的驱动程序 make menuconfig 编辑 drivers/char/Makefile 才是真正把编写好的源文件加入到编译中去 make modules cp drivers/char/first_driver.ko ~/nfs/rootfs/

圆片/圆盘测厚设备 HW01-SG系列单点测厚仪

关键字:圆片测厚仪圆盘测厚仪, 圆形测厚仪, 单点测厚仪, 汽车工件测厚仪, 产品简介: 测厚仪采用上下两个对射的激光位移传感器测量圆盘状物体边缘的厚度。圆盘放置在由步进电机驱动的托盘上,点按测量按钮托盘旋转一周,可测量被测物整个圆周上…

在Linux系统上使用nmcli命令配置各种网络(有线、无线、vlan、vxlan、路由、网桥等)

前言:原文在我的博客网站中,持续更新数通、系统方面的知识,欢迎来访! 在Linux系统上使用nmcli命令配置各种网络(有线、无线、vlan、vxlan等)https://myweb.myskillstree.cn/123.html 更新于2024/5/13&…

fyne更新GUI内容

fyne更新GUI内容 实现一个时钟界面,每秒钟更新一次。 package mainimport ("fyne.io/fyne/v2/app""fyne.io/fyne/v2/widget""time" )func updateTime(label *widget.Label) {formatted : time.Now().Format("2006-01-02 15:04…

使用websocket和服务建立链接慢的原因分析

1、java 项目使用websocketHandler创建websocket服务,在拦截器HttpSessionHandshakeInterceptor中,beforeHandshake日志到的很快,afterHandshake很慢 建立链接一直在连接中 2、原因分析: 找到服务器上的进程名 jps -l 3、使用…

微信原生小程序-图片上传回显(含组件封装详解)

实现效果(如图所示):点击上传>弹出拍摄或从手机相册中选择图片或视频>选择图片上传>上传成功后回显图片。 文件梳理分析(注意点): index文件表示当前页面文件,case-upload-item文件表示…

pandas 读取Excel中有行名、列名的数据中的每个元素

读取Excel中有行名、列名的数据中的每个元素,使用pandas,Excel中的内容示例如下: 读取代码如下: def read_xlsx(file ):""" Excel矩阵数据读取 """try:df pd.read_excel(file)# 使用iterrows()方法迭代行for index, ro…

Linux初学1

Unix unix和LInux的关系 LInux的吉祥物tux Nginx Directoryhttps://mirror.iscas.ac.cn/centos/7/isos/x86_64/redhat7 网络连接 桥接模式:虚拟系统可以和外部系统通讯, 你自家里折腾当然桥接没问题,如果一个教室里全都用桥接&#xff1…

激光打标机:手机制造中不可或缺的加工设备

激光打标机在手机行业中有多种应用,主要体现在以下几个方面: 1. 手机外壳打标:光纤激光打标机在手机外壳上打标的痕迹非常美观,可以印上厂家品牌标识,既保证了手机外壳的美观,也提高了产品的打标质量和加工…