2024年黑马java零基础教学

黑马java零基础教学项目和 markdown 文件资料 https github com cocochimp Java H5 Study Resources 文章目录 7 IO 流 7 1 File 类 7 2 字节流 7 2 1 字节输出流 7 2 2 字节输入流 7 3 字节缓冲流 7 4 字符流 7 4 1 字符输出流 7 4 2 字符输入流 7 5 字符缓冲流 7 6

大家好,我是讯享网,很高兴认识大家。



文章目录

  • 7. IO流
    • 7.1 File类
    • 7.2 字节流
      • 7.2.1 字节输出流
      • 7.2.2 字节输入流
    • 7.3 字节缓冲流(*)
    • 7.4 字符流
      • 7.4.1 字符输出流
      • 7.4.2 字符输入流
    • 7.5 字符缓冲流(*)
    • 7.6 字节字符案例
      • 7.6.1 集合到文件
      • 7.6.2 文件到集合
      • 7.6.3 点名器
      • 7.6.4 集合到文件【改进版】
      • 7.6.5 文件到集合【改进版】
    • 7.7 IO流案例
      • 7.7.1 集合到文件数据排序【改进版】
      • 7.7.2 复制单级文件夹
      • 7.7.3 复制多级文件夹
      • 7.7.4 复制文件的异常处理
    • 7.8 IO特殊操作流
      • 7.8.1 标准输入流
      • 7.8.2 标准输出流
      • 7.8.3 字节打印流
      • 7.8.4 字符打印流
      • 7.8.5 复制Java文件打印流【改进版】
    • 7.9 对象序列化
      • 7.9.1 对象序列化流
      • 7.9.2 对象反序列化流
      • 7.9.3 serialVersionUID & transient
    • 7.10 Properties集合
  • 8. 经典案例
    • 8.1 基础练习(基本语法)
    • 8.2 运动员案例(面向对象)
    • 8.3 学生管理系统(面向对象)
    • 8.4 斗地主案例(集合)
    • 8.5 游戏次数案例(IO流)

7. IO流

概述

IO流分为“字节流”和“字符流”两种形式

  • 字节流

image-20230131134136890

  • 字符流

image-20230131134154792

  • IO流介绍
    • IO:输入/输出(Input/Output)
    • 流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输
    • IO流就是用来处理设备间数据传输问题的。常见的应用:文件复制;文件上传;文件下载
  • IO流的分类
    • 按照数据的流向
      • 输入流:读数据
      • 输出流:写数据
    • 按照数据类型来分
      • 字节流
        • 字节输入流
        • 字节输出流
      • 字符流
        • 字符输入流
        • 字符输出流
  • IO流的使用场景
    • 如果操作的是纯文本文件,优先使用字符流
    • 如果操作的是图片、视频、音频等二进制文件。优先使用字节流
    • 如果不确定文件类型,优先使用字节流。字节流是万能的流

7.1 File类

  • File类介绍
    • 它是文件和目录路径名的抽象表示
    • 文件和目录是可以通过File封装成对象的
    • 对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以是不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在的
  • File类的构造方法
方法名说明File(String pathname)通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例File(String parent, String child)从父路径名字符串和子路径名字符串创建新的 File实例File(File parent, String child)从父抽象路径名和子路径名字符串创建新的 File实例
 
讯享网 

1、File类的创建功能

方法名说明public boolean createNewFile()当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空 文件public boolean mkdir()创建由此抽象路径名命名的 目录public boolean mkdirs()创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录(多级目录)
讯享网

2、File类的判断和获取功能

  • 判断功能
方法名说明public boolean isDirectory()测试此抽象路径名表示的File是否为目录public boolean isFile()测试此抽象路径名表示的File是否为文件public boolean exists()测试此抽象路径名表示的File是否存在
  • 获取功能
方法名说明public String getAbsolutePath()返回此抽象路径名的绝对路径名字符串public String getPath()将此抽象路径名转换为路径名字符串public String getName()返回由此抽象路径名表示的文件或目录的名称public String[] list()返回此抽象路径名表示的目录中的文件和目录的名称字符串数组public File[] listFiles()返回此抽象路径名表示的目录中的文件和目录的File对象数组
 

3、File类删除功能

  • 方法分类
方法名说明public boolean delete()删除由此抽象路径名表示的文件或目录
讯享网
  • 绝对路径和相对路径的区别
    • 绝对路径:完整的路径名,不需要任何其他信息就可以定位它所表示的文件。例如:E:itcastjava.txt
    • 相对路径:必须使用取自其他路径名的信息进行解释。例如:myFilejava.txt

4、递归遍历目录

  • 案例需求

    给定一个路径(E:itcast),通过递归完成遍历该目录下所有内容,并把所有文件的绝对路径输出在控制台

 

7.2 字节流

概述

字节流抽象基类

  • InputStream:这个抽象类是表示字节输入流的所有类的超类
  • OutputStream:这个抽象类是表示字节输出流的所有类的超类
  • 子类名特点:子类名称都是以其父类名作为子类名的后缀

7.2.1 字节输出流

1、字节流写数据

  • 字节输出流
    • FileOutputStream(String name):创建文件输出流以指定的名称写入文件
  • 使用字节输出流写数据的步骤
    • 创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)
    • 调用字节输出流对象的写数据方法
    • 释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)
 
  • 字节流写数据的三种方式
方法名说明void write(int b)将指定的字节写入此文件输出流 一次写一个字节数据void write(byte[] b)将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组 数据void write(byte[] b, int off, int len)将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据
 

2、字节流写数据的两个小问题

  • 字节流写数据如何实现换行
    • windows:
    • linux:
    • mac:
  • 字节流写数据如何实现追加写入
    • public FileOutputStream(String name,boolean append)
    • 创建文件输出流以指定的名称写入文件。如果第二个参数为true ,则字节将写入文件的末尾而不是开头
 

3、字节流写数据加异常处理

  • 异常处理格式
    • try-catch-finally
       
    • finally特点
      • 被finally控制的语句一定会执行,除非JVM退出
 

7.2.2 字节输入流

1、字节流读数据(一次读一个字节数据)

  • 字节输入流
    • FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream ,该文件由文 件系统中的路径名name命名
  • 字节输入流读取数据的步骤
    • 创建字节输入流对象
    • 调用字节输入流对象的读数据方法
    • 释放资源
 

2、字节流复制文本文件

  • 案例需求

    把“E:itcast窗里窗外.txt”复制到模块目录下的“窗里窗外.txt”

  • 实现步骤
    • 复制文本文件,其实就把文本文件的内容从一个文件中读取出来(数据源),然后写入到另一个文件中(目 的地)
    • 数据源: E:itcast窗里窗外.txt — 读数据 — InputStream — FileInputStream
    • 目的地: myByteStream窗里窗外.txt — 写数据 — OutputStream — FileOutputStream
 

3、字节流读数据(一次读一个字节数组数据)

  • 一次读一个字节数组的方法
    • public int read(byte[] b):从输入流读取最多b.length个字节的数据
    • 返回的是读入缓冲区的总字节数,也就是实际的读取字节个数
 

4、字节流复制文本文件

  • 案例需求

    把“E:itcast窗里窗外.txt”复制到模块目录下的“窗里窗外.txt”

  • 实现步骤
    • 复制文本文件,其实就把文本文件的内容从一个文件中读取出来(数据源),然后写入到另一个文件中(目的地)
    • 数据源:

      E:itcast窗里窗外.txt — 读数据 — InputStream — FileInputStream

    • 目的地:

      myByteStream窗里窗外.txt — 写数据 — OutputStream — FileOutputStream

 

5、字节流读数据(一次读一个字节数组数据)

  • 一次读一个字节数组的方法
    • public int read(byte[] b):从输入流读取最多b.length个字节的数据
    • 返回的是读入缓冲区的总字节数,也就是实际的读取字节个数
 

6、字节流复制图片

  • 案例需求

    把“E:itcastmn.jpg”复制到模块目录下的“mn.jpg”

  • 实现步骤
    • 根据数据源创建字节输入流对象
    • 根据目的地创建字节输出流对象
    • 读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
    • 释放资源
 

7.3 字节缓冲流(*)

1、概述

  • 字节缓冲流介绍
    • lBufferOutputStream:该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写 入字节,而不必为写入的每个字节导致底层系统的调用
    • lBufferedInputStream:创建BufferedInputStream将创建一个内部缓冲区数组。 当从流中读取或跳过 字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节
  • 构造方法
方法名说明BufferedOutputStream(OutputStream out)创建字节缓冲输出流对象BufferedInputStream(InputStream in)创建字节缓冲输入流对象
 

2、字节流复制视频

  • 案例需求

    把“E:itcast字节流复制图片.avi”复制到模块目录下的“字节流复制图片.avi”

  • 实现步骤
    • 根据数据源创建字节输入流对象
    • 根据目的地创建字节输出流对象
    • 读写数据,复制视频
    • 释放资源
 

7.4 字符流

1、为什么会出现字符流

  • 字符流的介绍

    由于字节流操作中文不是特别的方便,所以Java就提供字符流

    字符流 = 字节流 + 编码表

  • 中文的字节存储方式

    用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接 成中文,如何识别是中文的呢?

    汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数

2、编码表

  • 什么是字符集

    是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等 l计算机要准确的存储和识别各种字符集符号,就需要进行字符编码,一套字符集必然至少有一套字符编码。 常见字符集有ASCII字符集、GBXXX字符集、Unicode字符集等

  • 常见的字符集
    • ASCII字符集:

      lASCII:是基于拉丁字母的一套电脑编码系统,用于显示现代英语,主要包括控制字符(回车键、退格、 换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号)

      基本的ASCII字符集,使用7位表示一个字符,共128字符。ASCII的扩展字符集使用8位表示一个字符,共 256字符,方便支持欧洲常用字符。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、 图形符号、数字等

    • GBXXX字符集:

      GBK:最常用的中文码表。是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了 21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等

    • Unicode字符集:

      UTF-8编码:可以用来表示Unicode标准中任意字符,它是电子邮件、网页及其他存储或传送文字的应用 中,优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。它使用 一至四个字节为每个字符编码

    • 编码规则: 128个US-ASCII字符,只需一个字节编码 拉丁文等字符,需要二个字节编码 大部分常用字(含中文),使用三个字节编码 其他极少使用的Unicode辅助字符,使用四字节编码

3、字符串中的编码解码问题

  • 相关方法
方法名说明byte[] getBytes()使用平台的默认字符集将该 String编码为一系列字节byte[] getBytes(String charsetName)使用指定的字符集将该 String编码为一系列字节String(byte[] bytes)使用平台的默认字符集解码指定的字节数组来创建字符串String(byte[] bytes, String charsetName)通过指定的字符集解码指定的字节数组来创建字符串
 

4、字符流中的编码解码问题

  • 字符流中和编码解码问题相关的两个类
    • InputStreamReader:是从字节流到字符流的桥梁

      它读取字节,并使用指定的编码将其解码为字符

      它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

    • OutputStreamWriter:是从字符流到字节流的桥梁

      是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节

      它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集

  • 构造方法
方法名说明InputStreamReader(InputStream in)使用默认字符编码创建InputStreamReader对象InputStreamReader(InputStream in,String chatset)使用指定的字符编码创建InputStreamReader对象OutputStreamWriter(OutputStream out)使用默认字符编码创建OutputStreamWriter对象OutputStreamWriter(OutputStream out,String charset)使用指定的字符编码创建OutputStreamWriter对象
 

7.4.1 字符输出流

  • 方法介绍
方法名说明void write(int c)写一个字符void write(char[] cbuf)写入一个字符数组void write(char[] cbuf, int off, int len)写入字符数组的一部分void write(String str)写一个字符串void write(String str, int off, int len)写一个字符串的一部分
  • 刷新和关闭的方法
方法名说明flush()刷新流,之后还可以继续写数据close()关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据
 

7.4.2 字符输入流

  • 方法介绍
方法名说明int read()一次读一个字符数据int read(char[] cbuf)一次读一个字符数组数据
 

1、字符流复制Java文件

  • 案例需求

    把模块目录下的“ConversionStreamDemo.java” 复制到模块目录下的“Copy.java”

  • 实现步骤
    • 根据数据源创建字符输入流对象
    • 根据目的地创建字符输出流对象
    • 读写数据,复制文件
    • 释放资源
 

2、字符流复制Java文件改进版

  • 案例需求

    使用便捷流对象,把模块目录下的“ConversionStreamDemo.java” 复制到模块目录下的“Copy.java”

  • 实现步骤
    • 根据数据源创建字符输入流对象
    • 根据目的地创建字符输出流对象
    • 读写数据,复制文件
    • 释放资源
 

7.5 字符缓冲流(*)

  • 字符缓冲流介绍
    • BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可 以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途
    • BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓 冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途
  • 构造方法
方法名说明BufferedWriter(Writer out)创建字符缓冲输出流对象BufferedReader(Reader in)创建字符缓冲输入流对象
 

1、字符缓冲流复制Java文件

  • 案例需求

    把模块目录下的ConversionStreamDemo.java 复制到模块目录下的 Copy.java

  • 实现步骤
    • 根据数据源创建字符缓冲输入流对象
    • 根据目的地创建字符缓冲输出流对象
    • 读写数据,复制文件,使用字符缓冲流特有功能实现
    • 释放资源
 

2、字符缓冲流特有功能

  • 方法介绍

    BufferedWriter

    方法名说明void newLine()写一行行分隔符,行分隔符字符串由系统属性定义

    BufferedReader

    方法名说明String readLine()读一行文字。 结果包含行的内容的字符串,不包括任何行终止字符如果流的结尾已经 到达,则为null
 

3、字符缓冲流特有功能复制Java文件

  • 案例需求

    使用特有功能把模块目录下的ConversionStreamDemo.java 复制到模块目录下的 Copy.java

  • 实现步骤
    • 根据数据源创建字符缓冲输入流对象
    • 根据目的地创建字符缓冲输出流对象
    • 读写数据,复制文件,使用字符缓冲流特有功能实现
    • 释放资源
 

7.6 字节字符案例

7.6.1 集合到文件

  • 案例需求

    把文本文件中的数据读取到集合中,并遍历集合。要求:文件中每一行数据是一个集合元素

  • 实现步骤
    • 创建字符缓冲输入流对象
    • 创建ArrayList集合对象
    • 调用字符缓冲输入流对象的方法读数据
    • 把读取到的字符串数据存储到集合中
    • 释放资源
    • 遍历集合
 

7.6.2 文件到集合

  • 案例需求

    把ArrayList集合中的字符串数据写入到文本文件。要求:每一个字符串元素作为文件中的一行数据

  • 实现步骤
    • 创建ArrayList集合
    • 往集合中存储字符串元素
    • 创建字符缓冲输出流对象
    • 遍历集合,得到每一个字符串数据
    • 调用字符缓冲输出流对象的方法写数据
    • 释放资源
 

黑马java零基础教学

7.6.3 点名器

  • 案例需求

    我有一个文件里面存储了班级同学的姓名,每一个姓名占一行,要求通过程序实现随点名器

  • 实现步骤
    • 创建字符缓冲输入流对象
    • 创建ArrayList集合对象
    • 调用字符缓冲输入流对象的方法读数据
    • 把读取到的字符串数据存储到集合中
    • 释放资源
    • 使用Random产生一个随机数,随机数的范围在:[0,集合的长度)
    • 把第6步产生的随机数作为索引到ArrayList集合中获取值
    • 把第7步得到的数据输出在控制台
 

7.6.4 集合到文件【改进版】

  • 案例需求

    把ArrayList集合中的学生数据写入到文本文件。要求:每一个学生对象的数据作为文件中的一行数据 格式: 学号,姓名,年龄,居住地 举例:itheima001,林青霞,30,西安

  • 实现步骤
    • 定义学生类
    • 创建ArrayList集合
    • 创建学生对象
    • 把学生对象添加到集合中
    • 创建字符缓冲输出流对象
    • 遍历集合,得到每一个学生对象
    • 把学生对象的数据拼接成指定格式的字符串
    • 调用字符缓冲输出流对象的方法写数据
    • 释放资源
  • 学生类
 
  • 测试类
 

7.6.5 文件到集合【改进版】

  • 案例需求

    把文本文件中的数据读取到集合中,并遍历集合。要求:文件中每一行数据是一个学生对象的成员变量值 举 例:itheima001,林青霞,30,西安

  • 实现步骤
    • 定义学生类
    • 创建字符缓冲输入流对象
    • 创建ArrayList集合对象
    • 调用字符缓冲输入流对象的方法读数据
    • 把读取到的字符串数据用split()进行分割,得到一个字符串数组
    • 创建学生对象
    • 把字符串数组中的每一个元素取出来对应的赋值给学生对象的成员变量值
    • 把学生对象添加到集合
    • 释放资源
    • 遍历集合
  • 学生类

    同上

  • 测试类
 

7.7 IO流案例

7.7.1 集合到文件数据排序【改进版】

  • 案例需求
    • 键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩)。要求按照成绩总分从高到低写入文本文件
    • 格式:姓名,语文成绩,数学成绩,英语成绩 举例:林青霞,98,99,100
  • 分析步骤
    • 定义学生类
    • 创建TreeSet集合,通过比较器排序进行排序
    • 键盘录入学生数据
    • 创建学生对象,把键盘录入的数据对应赋值给学生对象的成员变量
    • 把学生对象添加到TreeSet集合
    • 创建字符缓冲输出流对象
    • 遍历集合,得到每一个学生对象
    • 把学生对象的数据拼接成指定格式的字符串
    • 调用字符缓冲输出流对象的方法写数据
    • 释放资源
  • 学生类
 
  • 测试类
 

7.7.2 复制单级文件夹

  • 案例需求
    • 把“E:itcast”这个文件夹复制到模块目录下
  • 分析步骤
    • 创建数据源目录File对象,路径是E:itcast
    • 获取数据源目录File对象的名称
    • 创建目的地目录File对象,路径由(模块名+第2步获取的名称)组成
    • 判断第3步创建的File是否存在,如果不存在,就创建
    • 获取数据源目录下所有文件的File数组
    • 遍历File数组,得到每一个File对象,该File对象,其实就是数据源文件
    • 获取数据源文件File对象的名称
    • 创建目的地文件File对象,路径由(目的地目录+第7步获取的名称)组成
    • 复制文件 由于不清楚数据源目录下的文件都是什么类型的,所以采用字节流复制文件 采用参数为File的构造方法
 

7.7.3 复制多级文件夹

  • 案例需求
    • 把“E:itcast”这个文件夹复制到 F盘目录下
  • 分析步骤
    • 创建数据源File对象,路径是E:itcast
    • 创建目的地File对象,路径是F:
    • 写方法实现文件夹的复制,参数为数据源File对象和目的地File对象
    • 判断数据源File是否是文件
    • 是文件:直接复制,用字节流
    • 不是文件: 在目的地下创建该目录 遍历获取该目录下的所有文件的File数组,得到每一个File对象 回到3继续(递归)
 

7.7.4 复制文件的异常处理

1、基本做法

 

2、JDK7版本改进

 

3、JDK9版本改进

 

7.8 IO特殊操作流

7.8.1 标准输入流

  • System类中有两个静态的成员变量
    • public static final InputStream in:标准输入流。通常该流对应于键盘输入或由主机环境或用户指定的 另一个输入源
    • public static final PrintStream out:标准输出流。通常该流对应于显示输出或由主机环境或用户指定的 另一个输出目标
  • 自己实现键盘录入数据
 

7.8.2 标准输出流

  • System类中有两个静态的成员变量
    • public static final InputStream in:标准输入流。通常该流对应于键盘输入或由主机环境或用户指定的 另一个输入源
    • public static final PrintStream out:标准输出流。通常该流对应于显示输出或由主机环境或用户指定的 另一个输出目标
  • 输出语句的本质:是一个标准的输出流
    • PrintStream ps = System.out;
    • PrintStream类有的方法,System.out都可以使用
 

7.8.3 字节打印流

  • 打印流分类
    • 字节打印流:PrintStream
    • 字符打印流:PrintWriter
  • 打印流的特点
    • 只负责输出数据,不负责读取数据
    • 永远不会抛出IOException
    • 有自己的特有方法
  • 字节打印流
    • PrintStream(String fileName):使用指定的文件名创建新的打印流
    • 使用继承父类的方法写数据,查看的时候会转码;使用自己的特有方法写数据,查看的数据原样输出
    • 可以改变输出语句的目的地

      public static void setOut(PrintStream out):重新分配“标准”输出流

 

7.8.4 字符打印流

  • 字符打印流构造房方法
方法名说明PrintWriter(String fileName)使用指定的文件名创建一个新的PrintWriter,而不需要自动执行刷新PrintWriter(Writer out, boolean autoFlush)创建一个新的PrintWriter out:字符输出流 autoFlush: 一个布尔值,如果 为真,则println , printf ,或format方法将刷新输出缓冲区
 

7.8.5 复制Java文件打印流【改进版】

  • 案例需求
    • 把模块目录下的PrintStreamDemo.java 复制到模块目录下的 Copy.java
  • 分析步骤
    • 根据数据源创建字符输入流对象
    • 根据目的地创建字符输出流对象
    • 读写数据,复制文件
    • 释放资源
 

7.9 对象序列化

概述

  • 对象序列化介绍
    • 对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象
    • 这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息
    • 字节序列写到文件之后,相当于文件中持久保存了一个对象的信息
    • 反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化

7.9.1 对象序列化流

  • 对象序列化流: ObjectOutputStream
    • 将Java对象的原始数据类型和图形写入OutputStream。 可以使用ObjectInputStream读取(重构)对 象。 可以通过使用流的文件来实现对象的持久存储。 如果流是网络套接字流,则可以在另一个主机上或 另一个进程中重构对象
  • 构造方法
方法名说明ObjectOutputStream(OutputStream out)创建一个写入指定的OutputStream的 ObjectOutputStream
  • 序列化对象的方法
方法名说明void writeObject(Object obj)将指定的对象写入ObjectOutputStream
  • 学生类
 
  • 测试类
 
  • 注意事项
    • 一个对象要想被序列化,该对象所属的类必须必须实现Serializable 接口
    • Serializable是一个标记接口,实现该接口,不需要重写任何方法

7.9.2 对象反序列化流

  • 对象反序列化流: ObjectInputStream
    • ObjectInputStream反序列化先前使用ObjectOutputStream编写的原始数据和对象
  • 构造方法
方法名说明ObjectInputStream(InputStream in)创建从指定的InputStream读取的ObjectInputStream
  • 反序列化对象的方法
方法名说明Object readObject()从ObjectInputStream读取一个对象
 

7.9.3 serialVersionUID & transient

  • serialVersionUID
    • 用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件,读取数据会不会出问题呢?
      • 会出问题,会抛出InvalidClassException异常
    • 如果出问题了,如何解决呢?
      • 重新序列化
      • 给对象所属的类加一个serialVersionUID
        • private static final long serialVersionUID = 42L;
  • transient
    • 如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?
      • 给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程
  • 学生类
 
  • 测试类
 

7.10 Properties集合

  • Properties介绍
    • 是一个Map体系的集合类
    • Properties可以保存到流中或从流中加载
    • 属性列表中的每个键及其对应的值都是一个字符串
 

1、Properties作为Map集合的特有方法

  • 特有方法
方法名说明Object setProperty(String key, String value)设置集合的键和值,都是String类型,底层调用 Hashtable方法 putString getProperty(String key)使用此属性列表中指定的键搜索属性Set stringPropertyNames()从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串
 

2、Properties和IO流相结合的方法

  • 和IO流结合的方法
方法名说明void load(InputStream inStream)从输入字节流读取属性列表(键和元素对)void load(Reader reader)从输入字符流读取属性列表(键和元素对)void store(OutputStream out, String comments)将此属性列表(键和元素对)写入此 Properties表中,以适合于使用 load(InputStream)方法的格式写入输出字节流void store(Writer writer, String comments)将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式写入输出字符流
 

8. 经典案例

8.1 基础练习(基本语法)

  1. 逢七必过

从任意一个数字开始报数,当你要报的数字包含7或者是7 的倍数时都要说:过。 为了帮助大家更好的玩这个游戏,这里我们直接在控制台打印出1-100之间的满足逢七必过 规则的数据。 这样,大家将来在玩游戏的时候,就知道哪些数据要说:过。

 
  1. 不死神兔

有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子, 假如兔子都 不死,问第二十个月的兔子对数为多少?

 
  1. 百钱百鸡

我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。 百钱 买百鸡,问鸡翁、鸡母、鸡雏各几何?

 
  1. 数组元素求和

有这样的一个数组,元素是{68,27,95,88,171,996,51,210}。求出该数组中满足要求的元素和, 要求是:求和的元素个位和十位都不能是7,并且只能是偶数

 
  1. 判断两个数组是否相同

定义一个方法,用于比较两个数组的内容是否相同

 
  1. 查找元素在数组中出现的索引位置

已知一个数组 arr = {19, 28, 37, 46, 50}; 键盘录入一个数据,查找该数据在数组中的索引。 并在控制台输出找到的索引值。如果没有查找到,则输出-1

 
  1. 数组元素反转

已知一个数组 arr = {19, 28, 37, 46, 50}; 用程序实现把数组中的元素值交换, 交换后的数组 arr = {50, 46, 37, 28, 19}; 并在控制台输出交换后的数组元素。

 
  1. 评委打分

在编程竞赛中,有6个评委为参赛的选手打分,分数为0-100的整数分。 选手的最后得分为:去掉一个最高分和一 个最低分后的4个评委平均值 (不考虑小数部分)。

 
  1. 冒泡排序

概述:一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,将较大的数据放在后面,依次对所有的数据进行操作,直至所有数据按要求完成排序

  • 如果有n个数据进行排序,总共需要比较n-1次
  • 每一次比较完毕,下一次的比较就会少一个数据参与
 

8.2 运动员案例(面向对象)

我们现在有乒乓球运动员和篮球运动员,乒乓球教练和篮球教练。

为了出国交流,跟乒乓球相关的人员都需要学习英语。

请用所学知识分析,这个案例中有哪些具体类,哪些抽象类,哪些接口,并用代码实现。

image-20230129122048888

  • 抽象人类
 
  • 抽象运动员类
 
  • 抽象教练类
 
  • 学英语接口
 
  • 篮球教练
 
  • 乒乓球教练
 
  • 乒乓球运动员
 
  • 篮球运动员
 

8.3 学生管理系统(面向对象)

实现步骤

  • 案例需求

针对目前我们的所学内容,完成一个综合案例:学生管理系统!该系统主要功能如下:

添加学生:通过键盘录入学生信息,添加到集合中

删除学生:通过键盘录入要删除学生的学号,将该学生对象从集合中删除

修改学生:通过键盘录入要修改学生的学号,将该学生对象其他信息进行修改

查看学生:将集合中的学生对象信息进行展示

退出系统:结束程序

  • 实现步骤
  1. 定义学生类,包含以下成员变量

    private String sid // 学生id

    private String name // 学生姓名

    private String age // 学生年龄

    private String address // 学生所在地

  2. 学生管理系统主界面的搭建步骤

    2.1 用输出语句完成主界面的编写

    2.2 用Scanner实现键盘输入

    2.3 用switch语句完成选择的功能

    2.4 用 循环完成功能结束后再次回到主界面

  3. 学生管理系统的添加学生功能实现步骤

    3.1 定义一个方法,接收ArrayList集合

    3.2 方法内完成添加学生的功能 ①键盘录入学生信息 ②根据录 入的信息创建学生对象 ③将学生对象添加到集合中 ④提示添加成功信息

    3.3 在添加学生的选项里调用 添加学生的方法

  4. 学生管理系统的查看学生功能实现步骤

    4.1 定义一个方法,接收ArrayList集合

    4.2 方法内遍历集合,将学生信息进行输出

    4.3 在查看所有学生选 项里调用查看学生方法

  5. 学生管理系统的删除学生功能实现步骤

    5.1 定义一个方法,接收ArrayList集合

    5.2 方法中接收要删除学生的学号

    5.3 遍历集合,获取每个学生对 象

    5.4 使用学生对象的学号和录入的要删除的学号进行比较,如果相同,则将当前学生对象从集合中删除 5.5 在删除学生选项里调用删除学生的方法

  6. 学生管理系统的修改学生功能实现步骤

    6.1 定义一个方法,接收ArrayList集合

    6.2 方法中接收要修改学生的学号

    6.3 通过键盘录入学生对象所需 的信息,并创建对象

    6.4 遍历集合,获取每一个学生对象。并和录入的修改学生学号进行比较.如果相 同,则使用新学生对象替换当前学生对象

    6.5 在修改学生选项里调用修改学生的方法

  7. 退出系统

    使用System.exit(0);退出JVM

实现流程

  • 学生类的定义
 
  • 测试类的定义
 

8.4 斗地主案例(集合)

1、模拟斗地主案例-普通版本

通过程序实现斗地主过程中的洗牌,发牌和看牌

 

2、模拟斗地主案例-升级版本

通过程序实现斗地主过程中的洗牌,发牌和看牌。要求:对牌进行排序

 

8.5 游戏次数案例(IO流)

  • 案例需求
    • 实现猜数字小游戏只能试玩3次,如果还想玩,提示:游戏试玩已结束,想玩请充值(www.itcast.cn)
  • 分析步骤
    • 写一个游戏类,里面有一个猜数字的小游戏
    • 写一个测试类,测试类中有main()方法,main()方法中写如下代码:

      从文件中读取数据到Properties集合,用load()方法实现

      文件已经存在:game.txt

      里面有一个数据值:count=0

      通过Properties集合获取到玩游戏的次数

      判断次数是否到到3次了

      如果到了,给出提示:游戏试玩已结束,想玩请充值(www.itcast.cn)

      如果不到3次: 次数+1,重新写回文件,用Properties的store()方法实现玩游戏

小讯
上一篇 2024-12-27 14:17
下一篇 2024-12-30 14:50

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/155.html