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.mzph.cn/diannao/12875.shtml

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

相关文章

论文阅读:基于改进 YOLOv5算法的密集动态目标检测方法

目录 概要 Motivation 整体架构流程 技术细节 小结 论文地址:基于改进YOLOv5算法的密集动态目标检测方法 - 中国知网 (cnki.net) 概要 目的:提出一种基于 YOLOv5改进的检测算法,解决密集动态目标检测精度低及易漏检的问题。 方法&…

Linux虚拟主机cPanel重置密码

我使用的Hostease的Linux虚拟主机产品默认带普通用户权限的cPanel面板,这边自购买后一直未重新设置过cPanel面板的密码,但是了解到要定期重置一下cPanel面板的密码,以确保主机数据安全,因此想要进行重置cPanel面板的密码&#xff…

SpringBoot上传文件到服务器(跨服务器上传)

目录 (一)上传文件到本地(windows) (二)上传文件到linux服务器 (三)跨服务器上传文件 (一)上传文件到本地(windows) 1.新建一个文件…

第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组 AB路线

//bfs 1000100010不会超时 #include<bits/stdc.h> using namespace std; #define int long long const int n1e311; int a,b,c,h[n][n][12],k[4][2]{0,1,0,-1,1,0,-1,0}; char t[n][n]; struct s {int x,y,z,w; }; signed main() {ios::sync_with_stdio(false);cin.t…

(规格参考)ADP5360ACBZ-1-R7 电量计 电池管理IC,ADP5072ACBZ 双通道直流开关稳压器,ADL5903ACPZN 射频检测器

1、ADP5360ACBZ-1-R7&#xff1a;具有超低功耗电量计、电池保护功能的先进电池管理PMIC 功能&#xff1a;电池保护 电池化学成份&#xff1a;锂离子/聚合物 电池数&#xff1a;1 故障保护&#xff1a;超温&#xff0c;过压 接口&#xff1a;I2C 工作温度&#xff1a;-40C ~ 85…

Spring Security入门教程:实现自定义用户配置

在上一篇文章中&#xff1a;Spring Security入门教程&#xff1a;利用Spring Security实现安全控制 我们学会了使用Spring Security实现安全控制&#xff0c;学会了他的基础使用&#xff0c;这节课我们来学习一下它的自定义的功能&#xff0c;更深入的了解和使用Spring Securit…

OpenHarmony 实战开发——ArkUI canvas组件

canvas 是 ArkUI 开发框架里的画布组件&#xff0c;常用于自定义绘制图形。因为其轻量、灵活、高效等优点&#xff0c;被广泛应用于 UI 界面开发中。本期&#xff0c;我们将为大家介绍 ArkUI 开发框架中 canvas 组件的使用。 一、canvas 介绍 1.1 什么是 canvas&#xff1f; …

rocketmq的存储和检索

messageId是rocketmq自动生成的。

Java的response返回Json格式

问题 今天开发过程中&#xff0c;写了个拦截器&#xff0c;对于所以请求进行一个token的工作&#xff0c;对于不合标准的token返回错误&#xff0c;在网上找了个拦截器进行二次开发。 package com.maizhiyu.yzt.handle;import org.springframework.beans.factory.annotation.…

AWS Lambda配置CloudWatch日志

Hello example&#xff1a;AWS Lambda 第一个例子Hello (JAVA)-CSDN博客 创建lambda函数&#xff0c;测试&#xff0c;然后点击CloudWatch日志 CloudWatch日志组不存在 创建CloudWatch日志组 1) CloudWatch -> 日志组 -> 创建日志组 2) 填写名称&#xff0c;创建 添加权…

掌握这些神器,让你的编程之路更加“丝滑”

前言&#xff1a; 在软件开发的旅程中&#xff0c;程序员的实用神器确实如同指南针&#xff0c;帮助他们在复杂的代码海洋中导航。以下是从三个方向——自动化测试工具、持续集成/持续部署&#xff08;CI/CD&#xff09;以及代码审查与质量分析——来探讨这些实用神器的应用和影…

SC8908电机驱动芯片替代AN41908

SC8908 描述 五路H桥静音驱动电机驱动芯片&#xff0c;闭环直流电机光圈调节&#xff0c;支持霍尔位置检测&#xff0c; 2个步进电机。步进电机驱动带256微步细分。 主要特性 • 步进驱动H桥每路250mA最大驱动电流 • 光圈直流驱动H桥每路150mA最大驱动电流 • 单独…

1725 ssm资产管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java ssm资产管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/…

libssh C++封装之六(Dir)

1 概述 libssh是一个在客户端和服务器端实现SSHv2协议的多平台C库。使用libssh,您可以远程执行程序、传输文件、使用安全透明的隧道、管理公钥等等。本文描述的对libssh客户端功能的C++封装。 libssh下载地址 3 实现 3.5 Dir Dir类型管理远程路径,通过SFTP和Channel实现(有…

uni u-form-item 只有图标点击有效

如下,输入的地方是个选择项,代码如下: <u-form-item class=u-form-item label="监督主题" prop="themeName" borderBottom ref="item1" @click="openPopup(0)" > <u--input v-model="form.themeNam…

定时发圈操作介绍

1、登陆已有的账号&#xff0c;点击到"朋友圈"功能 2、选择要发圈的微信号&#xff0c;编辑发圈的文案内容 3、自定义想要的时间点 4、点击"立即发送" 5、可进行跟圈

深度解析 Spring 源码:解密AOP切点和通知的实现机制

文章目录 深度解析 Spring 源码&#xff1a;解密AOP切点和通知的实现机制一、Spring AOP的基础知识1.1 AOP的核心概念&#xff1a;切点、通知、切面等1.2 Spring AOP与传统AOP的区别和优势 二、深入分析切点和通知的实现2.1 研究 Pointcut 接口及其实现类2.1.1 Pointcut 接口2.…

数据库审计系统Yearning使用笔记

一、启动 1、初始化MySQL 启动mysql docker run -d --namemysql -p 3306:3306 -e MYSQL_ROOT_PASSWORDroot mysql:5.7创建数据库&#xff0c;链接数据库并执行以下创建库的脚步&#xff0c;注意字符集 create database yearning char set utf8mb42、启动Yeelabs 需要执行…

CDGA|揭秘移动物联网数据治理秘诀,轻松提升数据质量,赋能智慧未来

在数字化浪潮汹涌的今天&#xff0c;移动物联网作为连接物理世界与数字世界的桥梁&#xff0c;其数据治理的重要性日益凸显。高质量的数据不仅是企业决策的基石&#xff0c;更是推动行业智能化、精细化发展的关键。本文将为您揭秘移动物联网数据治理的技巧&#xff0c;助您轻松…

如何设计实用的ITSM自助服务台

在现代IT服务管理&#xff08;ITSM&#xff09;领域中&#xff0c;自助服务台已成为IT运维环境的核心组件。它作为企业内部信息中心与其他部门用户之间的桥梁&#xff0c;一个以用户为中心的平台&#xff0c;更注重用户的自主性和自助能力&#xff0c;使用户能够直接访问所需的…