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;

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

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

相关文章

git 本地工作区和仓库区基本使用

(1)git 本地有三个区 工作区和暂存区和 git管理的仓库. (自行动手实践理解,然后就入门了)(2)本地初次使用git做的事情,需要做如下工作 git config --global user.name "xx" git config --global user.email xxxqq.com git config --globa…

java 工程管理系统源码+项目说明+功能描述+前后端分离 + 二次开发

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示…

编写第一个Go程序

编写第一个Go程序 1. 开发环境构建 在Go语言中,开发环境的构建需要设置GOPATH环境变量。在1.8版本之前,必须显式设置GOPATH环境变量。而在1.8版本及之后,如果没有设置GOPATH,Go将使用默认值。 在Unix系统上,默认值为…

基于YOLOv8模型的条形码二维码检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要:基于YOLOv8模型的条形码二维码检测系统可用于日常生活中检测与定位条形码与二维码目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测…

【JavaScript】解构

解构(Destructuring)是 JavaScript 中一种强大的语法特性,它允许你从数组或对象中提取值并赋值给变量,使代码更加简洁和易读。JavaScript 中有两种主要的解构语法:数组解构和对象解构。 数组解构 数组解构用于从数组…

端到端可追溯性在产品开发中有哪些好处

追溯性是指跟踪需求与其他工件(从测试用例到更高级别的系统或子系统需求)之间的上游和下游关系的能力。通过端到端的追溯性,团队可以查看产品的开发过程是否当前处于正轨,以及查看与其相关的所有历史和背景。 至少,这…

Python 数据分析入门教程:Numpy、Pandas、Matplotlib和Scikit-Learn详解

文章目录 Python数据分析入门教程Numpy库Pandas库Matplotlib绘图Scikit-Learn机器学习 NumPy数组与运算NumPy数组对象数组创建函数数组运算数组索引数组操作总结 总结python精品专栏推荐python基础知识(0基础入门)python爬虫知识 Python数据分析入门教程…

Android12之仿Codec2.0实现传递编解码器组件本质(四十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

多策略改进蜣螂优化--螺旋搜索+最优值引导+反向学习策略

声明:对于作者的原创代码,禁止转售倒卖,违者必究! 关于蜣螂算法的原理网上有很多,本文就不再详细介绍,本期算法是作者在参考了网上一些文献后自行改进的,接下来直接上改进策略: ①螺…

十六)Stable Diffusion教程:出图流程化

今天说一个流程化出图的案例,适用很多方面。 1、得到线稿,自己画或者图生图加线稿lora出线稿;如果想sd出图调整参数不那么频繁细致,则线稿的素描关系、层次、精深要表现出来,表现清楚。 2、文生图,seed随机…

前后端分离毕设项目之springboot同城上门喂遛宠物系统(内含文档+源码+教程)

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…

Quartz 建表语句SQL文件

SQL文件在jar里面,github下载 https://github.com/quartz-scheduler/quartz/releases/tag/v2.3.2 解压,sql文件路径:quartz-core\src\main\resources\org\quartz\impl\jdbcjobstore tables_mysql_innodb.sql # # In your Quartz propertie…

七天学会C语言-第七天(结构体)

1.定义结构体 例 1&#xff1a;把一个学生的信息(包括学号、姓名、性别、住址等 4 项信息) 放在一个结构体变量中&#xff0c;然后输出这个学生的信息。 #include <stdio.h>struct Student {int student_id;char name[30];char gender;char address[60]; };int main() …

Flink的部署模式:Local模式、Standalone模式、Flink On Yarn模式

Flink常见的部署模式 Flink部署、执行模式Flink的部署模式Flink的执行模式 Local本地模式下载安装启动、停止Flink提交测试任务停止作业 Standalone独立模式会话模式单作业模式应用模式 YARN运行模式会话模式启动Hadoop集群申请一个YARN会话查看Yarn、Flink提交作业查看、测试作…

SQL模板-用户留存率计算

在这段实习中&#xff0c;我遇到了用户留存率计算的需求&#xff0c;这里做个总结。 首先来讲下&#xff0c;什么是用户留存&#xff1f; 在互联网行业中&#xff0c;用户在某段时间内开始使用应用&#xff0c;经过一段时间后&#xff0c;仍然继续使用该应用的用户。用户留存一…

代码随想录二刷day35

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣860. 柠檬水找零二、力扣406. 根据身高重建队列三、力扣452. 用最少数量的箭引爆气球 前言 一、力扣860. 柠檬水找零 class Solution {public boolean…

5.docker可视化工具(Portainer)

本文操作&#xff0c;在 192.168.204.102 机器执行 安装最新版 portainer&#xff0c;请使用 portainer/portainer-ce 镜像。图片来源&#xff1a;https://hub.docker.com/r/portainer/portainer。   来这里可查看最新版本&#xff1a;https://github.com/portainer/p…

设计模式:适配器模式(C++实现)

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构设计模式&#xff0c;它允许将一个类的接口转换成客户端所期望的另一个接口。适配器模式通常用于连接两个不兼容的接口或类&#xff0c;使它们能够一起工作。 以下是一个简单的C适配器模式的示例&#xff1a; #in…

内网穿透,轻松实现PostgreSQL数据库公网远程连接!

文章目录 前言1. 安装postgreSQL2. 本地连接postgreSQL3. Windows 安装 cpolar4. 配置postgreSQL公网地址5. 公网postgreSQL访问6. 固定连接公网地址7. postgreSQL固定地址连接测试 前言 PostgreSQL是一个功能非常强大的关系型数据库管理系统&#xff08;RDBMS&#xff09;,下…

MongoDB的搭建 和crud操作

MongoDB docker 下载 docker run --restartalways -d --name mongo -v /docker/mongodb/data:/data/db -p 27017:27017 mongo:4.0.6使用navcat工具使用MongoDB Crud操作 jar包 <dependency><groupId>org.projectlombok</groupId><artifactId>lom…