当前位置: 首页 > news >正文

IO流内容总结

IO流作用

对文件或者网络中的数据进行读写操作。

简单记:输入流读数据,输出流写数据。

Java的输出流主要以OutputStream和Writer作为基类,输入流主要是以InputStream和Reader作为基类。

按处理数据单元分类

字节流
  • 字节输入流:InputStream,常用的实现类是FileInputStream
  • 字节输出流:OutputStream,常用的实现类是FileOutputStream
字符流
  • 字符输入流:Reader,常用实现类FileReader
  • 字符输出流:Writer,常用实现类FileWriter

字节流

InputStream类的一些常用方法:

in.read() 从输入流中读取下一个字节的数据

in.read(byte[] b):将读取出来的数据存入字节数组中

in.read(byte[] b, int offset, int len):从输入流中读取最多len长度的字节,保存到字节数组b中,保存的位置从offset开始

in.readAllbytes():读取所有字节,返回一个字节数组

FileInputStream类的常用方法,InputStream中的所欲方法都可以用。

int  available():可读取的字节数

long  skip(long n):跳过个字节开始读取

OutputStream类的常用方法:

void  write(int c):将指定的字节写入输出流

void write(byte[] b):将数组中的所有字节写入输出流中

void write(byte[] b, int offset, int len):将字节数组中从偏移量offset开始的长度为len的字节数据输出到输出流中

close():关闭资源

FileOutputStream类的常用方法,OutputStream的所有方法它都可以使用

构造方法:

public FileOutputStream(File file)

public FileOutputStream(File file,boolean append)

public FileOutputStream(String name)

public FileOutputStream(String name,boolean append)

JDK7以前的资源释放

在try-catch的try中释放资源。

JDK7以后的资源释放

使用try-with-source,实现了AutoCloseable接口的类的对象才可以可以自动释放资源。

字符流

Reader类的常用方法:

int read():读取下一个字节

int read(char[] chars):将读取出来的字符存到chars数组中

int read(char[] chars, int offset, int len):从输入流中最多读取len个字符,保存到字符数组 c中,保存的位置从offset位置开始,返回实际读取的字符数

void mark(int readlimit):标记流中的当前位置

boolean markSupported():检索此流是否支持标记

long transferTo(Writer out):复制内容到另一个文件中

FileReader类的常用方法:

构造方法(字符流可以在创建对象的时候指定字符集,这一点与字节流不同)

public FileReader(File file)

public FileReader(File file, Charset  set)

public FileReader(String name)

public FileReader(String name, Charset  set)

构造方法中不指定字符集,就使用平台的默认字符。

Writer类的常用方法:

void write(String str)

void write(String str, int offset, int len):将str字符串里从offset位置开始,长度为len的多个字符输出到输出流中

void write(char[] chars):将字符存到插入式数组中

void write(char[] chars, int offset, int len):写入字符数组的一部分

void close:关闭资源

void flush():刷新流,字符流写入完成之后必须刷新,这样写出去的数据才能生效

FileWriter类的常用方法:

构造方法:

public FileWriter(File file)

public FileWriter(File file, Charset set)

public FileWriter(File file, Charset set, boolean append)

public FileWriter(String name)

public FileWriter(String name, Charset set)

public FileWriter(String name, Charset set, boolean append)

字节流和字符流的使用时机

字节流处理记事本无法正常读取的,例如图片、视频、音频。

字符流处理记事本可以正常读取的,涉及到字符的。

缓存流

字节缓存流
  • 字节输入缓存流:BufferedInputStream,InputStream的子类,与FileInputStream搭配使用
  • 字节输出缓存流:BufferedOutputStream,OutputStream的子类,与FileOutputStream搭配使用
字符缓存流
  • 字符输入缓存流:BufferedReader,Reader的子类,与FileReader搭配使用
  • 字符输出缓存流:BufferedWriter,Writer的子类,与FileWriter搭配使用

缓存流的作用:对原始流进行包装,提高原始流读写数据的性能。缓存流不能单独使用,缓存流依赖于原始流。

缓存流底层有一个8kb的数组,读数据的时候会一次性把数组读满,然后每次从数组中拿数据,写数据的时候也会把数组写满,然后再从数组中取。

字节缓存流构造方法:

BufferedInputStream(InputStream in):传一个原始流对象

BufferedInputStream(InputStream in,int size):size指缓存的大小

BufferedOutputStream(OutputStream out):传一个原始流对象

BufferedOutputStream(OutputStream out,int size):size指缓存的大小

常用方法:

void mark(int readlimit):标记流中的当前位置

boolean markSupported():测试此流是否支持mark和reset方法

void reset():返回标记处

字符缓存流的构造方法:

BufferedReader(Reader in):传一个原始流对象

BufferedReader(Reader in, int size):size指缓存的大小

新增方法:

String readLine():读取一行文本

BufferedWriter(Writer out):传一个原始流对象

BufferedWriter(Writer out, int size):size指缓存的大小

新增方法:

void writeLine():写一行文本

void newLine():换行

转换流

转换流用于将字节流转换为字符流。

InputStreamReader类

构造方法:

InputStreamReader(InputStream in)

InputStreamReader(InputStream in, Charset set)

InputStreamReader(InputStream in, String charsetName)

常用方法:

String getEncoding():获取该流使用的字符集

OutputStreamWriter类

构造方法:

OutputStreamWriter(OutputStream out)

OutputStreamWriter(OutputStream out, Charset set)

OutputStreamWriter(OutputStream out, String charsetName)

常用方法:

String getEncoding():获取该流使用的字符集

数据流

数据流是一种包装流,需要和原始流结合使用。

DataInputStream

新增方法:可以读取特定数据类型的字节

void write(byte[] b, int off, int len)

void write(int b)

final void writeBoolean(boolean v)

final void writeByte(int v)

final void writeBytes(String s)

final void writeChar(int v)

final void writeChars(String s)

final void writeDouble(double v)

final void writeUTF(String str)

DataOutputStream

DataOutputStream的方法和DataInputStream的差不多。

对象流读取对象信息

深浅拷贝

深拷贝和浅拷贝是用于描述对象复制的两个概念。

浅拷贝:复制了对象的引用,不是实际的数据。因此,新对象和原始对象共享引用数据类型的引用,修改原始对象的值会影响复制之后的对象的值。

深拷贝:创建一个新对象,将原始对象的所有成员变量递归的复制到新对象中。新对象和原始对象互不影响,互相独立。

Cloneable接口

Cloneable接口是一个标记接口,它本身不包含任何方法。如果一个类实现了Cloneable接口,那就

表明该类的实例可以通过调用 Object 类的 clone() 方法来创建一个新的对象,就是可以拷贝。
Cloneable接口并没有定义clone()方法,而是要求实现类提供自己的clone()方法来执行克隆作。
clone() 方法执行的是浅拷贝操作。
实现Cloneable接口必须要重写clone()方法,这个clone()是Object类的,如果是深拷贝要在clone()方法中进行额外的处理,就要递归的复制。

序列化和反序列化

序列化就是将对象的状态存储到特定存储介质中的过程,也就是将对象信息放到文本文件中,序列化后的对象时二进制状态。

反序列化就是和序列化相反,从特定存储介质中读取数据并重新构建对象的过程,也就是从文本文件中获取对象信息。

Serializable接口

此接口用于标识一个类可以被序列化,它是一个标记接口,没有任何方法。

序列化实现

ObjectOutputStream类

ObjectOutputStream也是包装类,要和原始流字节输出流结合使用,不能单独使用。

构造方法:

public ObjectOutputStream(OutputStream out)

使用方法:

writeObject(Object obj):将指定对象写入ObjectOutputStream中。

反序列化实现

ObjectInputStream类

ObjectInputStream类也是包装类,要和原始字节输入流结合使用。

使用方法

Object readObject():从ObjectInpuStream读取对象信息。

深拷贝的几种实现方法

  1. 自己写,比较麻烦,引用类型的成员变量需要递归的复制到新对象中。
  2. 序列化和反序列化:对象所在的类要实现Serialzable接口,才可以被序列化。ObjectOutputStream类的writeObject(obj)把对象写入文本文件中。ObjectInputStream类的readObject()从文本文件中获取对象信息。
  3. 现将对象转换成JSON字符串,再从JSON字符串转成对象,这个过程实现类深拷贝。
package exec.shencopy;import com.alibaba.fastjson2.JSON;
import lombok.Data;import java.io.*;@Data
public class Person implements Serializable,Cloneable {private String name;private String no;private Person son;public Person() {}public Person(String name, String no, Person son) {this.name = name;this.no = no;this.son = son;}@Overridepublic Object clone() {//使用JSON完成深拷贝String string = JSON.toJSONString(this);return JSON.parseObject(string, Person.class);}
//    @Override
//    public Object clone() {
//        //使用序列化,反序列化完成深拷贝
//        try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("E:/Html/abc/serializable.txt"));
//             ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("E:/Html/abc/serializable.txt"));) {
//            outputStream.writeObject(this);
//            return inputStream.readObject();
//        } catch (IOException e) {
//            e.printStackTrace();
//        } catch (ClassNotFoundException e) {
//            throw new RuntimeException(e);
//        }
//        return null;
//    }
}
package exec.shencopy;import java.io.*;public class Test {public static void main(String[] args) {//分别使用JSON和序列化反序列化实现Person person = new Person("小头爸爸","001",new Person("大头儿子","002",null));Person clone = (Person) person.clone();//使用序列化和反序列化实现深拷贝//使用JSON实现深拷贝System.out.println(person.getSon() == clone.getSon());}
}

transient关键字

transient关键字用于修饰类的成员变量,被该关键字修饰的变量不参与序列化。

SerialVersionUID

SerialVersionUID是Java中用于版本控制的一个特殊字段,用于确保序列化和反序列化的兼容性。序列化一个对象时,SerialVersionUID的值会被记录在序列化数据中。

反序列化时Java会检查当前SerialVersionUID的值与当前类中的SerialVersionUID值是否匹配。如果不匹配,会抛出InvalidClassException,从而防止对象的不兼容版本被序列化。

如果没有显示指定SerialVersionUID的值,Java会根据类结构自动生成一个SerialVersionUID,这种默认的计算方式在类结构变化时导致不兼容性。因此最好显示指定一个SerialVersionUID的值。

例如:private static final long serialVersionUID = 1l;

相关文章:

IO流内容总结

IO流作用 对文件或者网络中的数据进行读写操作。 简单记:输入流读数据,输出流写数据。 Java的输出流主要以OutputStream和Writer作为基类,输入流主要是以InputStream和Reader作为基类。 按处理数据单元分类 字节流 字节输入流&#xff…...

MySQL的进阶篇1-MySQL的存储引擎简介

存储引擎 MySQL的体系结构 0、客户端连机器【java、Python、JDBC等】 1、【MySQL服务器-连接层】认证,授权,连接池 2、【MySQL服务器-服务层】 {SQL接口(DML、DDL、存储过程、触发器)、解析器、查询优化器、缓存} 3、【MySQL…...

九芯电子丨语音智能风扇,助您畅享智慧生活

回忆童年时期的传统机械风扇,那“古老”的扇叶连摆动看起来是那么吃力。在一个闷热的夏夜,风扇的噪音往往令人印象深刻。但在今天,静音家用风扇已取代了传统的机械风扇。与此同时,随着智能化的发展,智能家居已逐渐成为…...

2101. 引爆最多的炸弹;752. 打开转盘锁;1234. 替换子串得到平衡字符串

2101. 引爆最多的炸弹 核心思想:枚举BFS。枚举每个炸弹最多引爆多少个炸弹,对每个炸弹进行dfs,一个炸弹能否引爆另一个炸弹是两个炸弹的圆心距离在第一个炸弹的半径之内。 752. 打开转盘锁 核心思想:典型BFS,就像水源扩散一样&a…...

​校园学习《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著

​校园学习《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著...

UOS服务器操作系统搭建离线yum仓库

UOS服务器操作系统搭建离线yum仓库 1050e版本操作系统(适用ARM64和AMD64)1、挂载everything镜像并同步2、配置本地仓库3、配置nginx发布离线源 1050e版本操作系统(适用ARM64和AMD64) 首先需要有everything镜像文件 服务端操作流…...

C# 实现数独游戏

1.数独单元 public struct SudokuCell{public SudokuCell() : this(0, 0, 0){}public SudokuCell(int x, int y, int number){X x; Y y; Number number;}public int X { get; set; }public int Y { get; set; }public int Number { get; set; }} 2.数独创建 public class …...

vscode + conda+ ffmpeg + numpy 的安装方式

Windows 搭建 环境 遇到的错误点: 解决,使用conda init conda activate myenv usage: conda-script.py [-h] [–no-plugins] [-V] COMMAND … conda-script.py: error: argument COMMAND: invalid choice: ‘activate’ (choose from ‘clean’, ‘comp…...

Python Union联合类型注解

视频版教程 Python3零基础7天入门实战视频教程 我们看下如下的示例: my_list2: list[int] [1, 2, 3, 4] my_dict2: dict[str, float] {"python222": 3.14, "java1234": 4.35} l1 [1, "python222", True] # 如何注解多种元素类型…...

提高接口自动化测试效率:使用 JMESPath 实现断言和数据提取!

前言 做接口自动化,断言是比不可少的。如何快速巧妙的提取断言数据就成了关键,当然也可以提高用例的编写效率。笔者在工作中接触到了JMESPath,那到底该如何使用呢?带着疑惑一起往下看。 JMESPath是啥? JMESPath 是一…...

【Linux操作系统教程】用户管理与权限管理你真的懂了吗(三)

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊 座右铭:不想…...

华为全联接大会2023 | 尚宇亮:携手启动O3社区发布

2023年9月20日,在华为全联接大会2023上,华为正式发布“联接全球服务工程师,聚合用户服务经验”的知识经验平台,以“Online 在线、Open 开放、Orchestration 协同”为理念,由华为、伙伴和客户携手,共同构建知…...

MySQL数据库查缺补漏——基础篇

MySQL数据库查缺补漏-基础篇 基础篇 net start mysql80[服务名] net stop mysql80 create database pshdhx default charset utf8mb4; 为什么不使用utf8?因为其字符占用三个字节,有四个字节的字符,所有需要设置为utf8mb4; 数值类型&…...

ESP8266 WiFi物联网智能插座—电能计量

目录 1、芯片功能 2、性能指标 3、寄存器说明 4、UART通信协议 4.1、写操作帧格式和时序 4.2、读操作帧格式和时序 4.3、读取全电参数数据包 4.4、配置波特率 4.5、UART保护机制 5、功能说明 5.1、电流电压瞬态波形计量 5.2、有功功率 5.3、有功功率防潜动 5.4、电能计量 5.5、…...

“智慧”北京,人工智能引领“新风尚”

原创 | 文 BFT机器人 北京时间,9月15日,北京人工智能产业峰会暨中关村科学城科创大赛颁奖典礼在北京中关村举行,同时惠阳还举行了“中关村人工智能大模型产业集聚区”启动建设的揭牌仪式。 此次大会围绕北京AI产业的建设与发展,各…...

狮子鱼社区团购小程序v18.1独立全开源版+小程序前端

狮子鱼社区团购商城系统小程序V18.1独立开源版,该系统本身就非常完善也没更新的必要,此系统拿来即用非常方便,同一版一样人类小徐特别优化很多细节首页美化了下,如小程序端授权窗口美化了下,该版本用户授权接口正常。功…...

深拷贝和浅拷贝的区别

本文内容 主要阐述下深拷贝和浅拷贝的区别 通俗理解 深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。 假设B复制了A,修改A的时候,看B是否发生变化: 如果B跟着也变了,说明是浅拷贝&…...

利用优化算法提高爬虫任务调度效率

目录 一、任务调度优化的重要性 二、选择合适的优化算法 三、建立任务调度模型 四、设计适应性函数 五、算法实施和调优 六、性能评估和优化结果分析 代码示例 总结 随着网络信息的爆炸式增长,网络爬虫在信息获取和数据挖掘等领域的应用越来越广泛。然而&am…...

Swiper的使用流程

1.官网查看演示 Swiper演示 - Swiper中文网 2.找到想使用的 比如想使用 卡片切换(255) 记住这个名字 3.去下载示例 下载Swiper - Swiper中文网 4.找到对应文件 5.根据里面引入的东西加到自己的页面 一定要引入swiper的 js 和 css html结构要按示例对应的三层结构 需要 …...

如何快速实现一个可视化看板?

一、用python实现一个可视化数据看板,最多支持多大体量的数据处理? Python可以通过多种可视化库来实现数据看板,例如Matplotlib、Seaborn、Plotly等。这些库可以处理各种规模的数据,从小型数据集到大型数据集都可以应用。 对于小型…...

基于PyTorch搭建FasterRCNN实现目标检测

基于PyTorch搭建FasterRCNN实现目标检测 1. 图像分类 vs. 目标检测 图像分类是一个我们为输入图像分配类标签的问题。例如,给定猫的输入图像,图像分类算法的输出是标签“猫”。 在目标检测中,我们不仅对输入图像中存在的对象感兴趣。我们还…...

线性表应用(非递减合并、分解链表、删除线性表)

将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间&#xff0c;不另外占用其它的存储空间。表中允许有重复的数据。 #include<iostream> using namespace std; typedef struct list {int data;list* next; }list,*linklist;…...

【C++面向对象侯捷下】1.导读

文章目录 来源&#xff1a;我的百度网盘 百科全书 专家书籍 C标准库 C编译器...

Ubuntu22.04 vnc远程黑屏

一、原因 原因是Ubuntu22.04使用的gnome启用了Wayland。vnc、teamviewer、向日葵、todesk等均无法使用或者远程黑屏等。 简单的说vnc、teamviewer、向日葵、todesk等均基于xorg实现&#xff08;xorg太流行&#xff09;&#xff0c;并不兼容Wayland&#xff0c;所以vnc无法正常…...

【1区TOP】Elsevier旗下CCF推荐,仅3个月左右录用!

01 期刊简介 CCF推荐人工智能类SCIE&EI 【期刊概况】IF&#xff1a;8.0-9.0&#xff0c;JCR1区&#xff0c;中科院2区TOP&#xff1b; 【版面类型】正刊&#xff1b; 【检索情况】SCIE&EI双检&#xff0c;CCF推荐&#xff1b; 【数据库收录年份】1992年&#xff…...

CentOS下安装Python3

一、电脑有网络&#xff1a; 1、直接使用yum包管理安装&#xff1a; yum是CentOS的默认包管理器&#xff0c;在安装软件时非常方便。要安装Python3&#xff0c;可以使用以下命令&#xff1a; sudo yum install python3等待安装完成后&#xff0c;查看python3是否安装完成 //不…...

微信小程序底部安全区域高度获取

CSS 属性 safe-area-inset-bottom safe-area-inset-bottom 就是安全区的高度 padding-bottom:env(safe-area-inset-bottom); wx.getSystemInfoSync() wx.getSystemInfoSync()可以获取系统信息 let system wx.getSystemInfoSync() let bottomSafe system.screenHeight -…...

虚拟机部署linux网络连接配置

1、虚拟机安装linux后&#xff0c;配置网络访问 虚拟机网络设置为NAT模式 linux网络配置好IP&#xff0c;主要是以下网络配置 2、linux没有ifconfig命令&#xff0c;ifconfig命令是在net-tools.x86_64包里 yum install net-tools.x86_64安装...

2591. 将钱分给最多的儿童(Java)

给你一个整数 money &#xff0c;表示你总共有的钱数&#xff08;单位为美元&#xff09;和另一个整数 children &#xff0c;表示你要将钱分配给多少个儿童。 你需要按照如下规则分配&#xff1a; 所有的钱都必须被分配。 每个儿童至少获得 1 美元。 没有人获得 4 美元。 请你…...

c++23中的新功能之十五类tuple类型的完全支持

一、std::tuple和std::pair 在传统的C里一直有一个问题让开发者不爽&#xff0c;就是无法返回多个值。一般来说&#xff0c;返回多个都建议采用封装的模式&#xff0c;比如弄一个结构体或者类啥的。这样做一定时没有问题的&#xff0c;但对于一些只返回一些简单值并且只在偶尔…...

昆明网站建设-中国互联/百度助手应用商店下载安装

这篇文章主要介绍了PhpstormXdebug断点调试PHP的方法&#xff0c;本教程将通过配置Xdebug扩展进行断点调试&#xff0c;目的在于提高大家的开发效率&#xff0c;感兴趣的小伙伴们可以参考一下为什么使用断点调试大家可能会觉得使用var_dump和echo也能调试啊&#xff0c;为什么还…...

公司注册网站诈骗莫名被起诉/友情链接只有链接

在对一个简单的Hello World工程进行项目结构剖析后&#xff0c;我们接着来学习下一个Android应用程序的生命周期是怎么样的&#xff0c;以便为后面的开发有个垫下良好的基石~ 所谓的应用程序生命周期无非就是应用程序进程从创建到消亡的整个过程。但是&#xff0c;之所有将这一…...

做网站还能挣钱吗/一件代发48个货源网站

1.鼠标设定:在Allegro视窗layout时,每执行一个指令例&#xff1a;Addconnect, Show element等鼠标会跳到Option窗口,这样对layout造成不便. 1)控制面版&#xff1e;滑鼠之移动选项中,指到预设按钮&#xff08;或智慧型移动&#xff09;&#xff1a;取消“在对话方块将滑鼠指标…...

ssh架构jsp网站开发/小程序推广50个方法

转自&#xff1a;超定方程组最优解&#xff08;最小二乘解&#xff09;推导 --------------------------------------------------------------------------------------------------------- 扩展阅读 &#xff08;1&#xff09;最小二乘以及最小二乘求解超定方程组最优解的推…...

威客做网站/高端网站建设报价

本文实例为大家分享了Java简易抽奖系统的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下需求&#xff1a;实现一个抽奖系统1 注册2 登录3 抽奖必须先注册 再登陆 再抽奖随机产生4个随机数作为幸运卡号用户注册后 登录的时候 用户名密码输入判断只有三次机会需要做…...

宁波网站优化软件/一键seo提交收录

时间设置有几个相关的概念&#xff1a;1、rtc时间/硬件时间&#xff1a;是指的例如主板上的某个实时时钟&#xff08;rtc&#xff09;硬件设备&#xff0c;这个时间是没有时区信息的&#xff0c;或者说他表示哪个时区的时间&#xff0c;依赖于“人为解读”2、系统时间&#xff…...