【Java】I/O流—转换流、序列化流的初学者指南及RandomAccessFile类

news2024/11/20 2:45:20

🌺个人主页Dawn黎明开始

🎀系列专栏Java
每日一句我不在意你曾堕落,我只在意你是否会崛起

📢欢迎大家:关注🔍+点赞👍+评论📝+收藏⭐️


文章目录

一.🔐转换流

📋前言

1.1🔓转换输出流

1.1.1🔑定义

1.1.2🔑构造方法

1.1.3🔑成员方法

1.1.4🔑实例练习

1.2🔓转换输入流

1.2.1🔑定义

1.2.2🔑构造方法

1.2.3🔑成员方法

1.2.4🔑实例练习

二.🔐RandomAccessFile类

1.1.1🔑构造方法

1.2.2🔑成员方法

1.2.3🔑实例练习

三.🔐对象序列化

3.1🔓前言

3.1.1🔑定义

3.1.2🔑目的

3.1.3🔑说明

3.2🔐序列化流

3.2.1🔑定义

3.2.2🔑实例练习

3.3🔐反序列化流

3.3.1🔑定义

3.3.2🔑实例练习


一.🔐转换流

📋前言

字节流操作中文数据不是特别的方便,所以就出现了转换流。

转换流的作用就是把字节流转换字符流来使用。

在JDK中,提供了两个类用于实现将字节流转换为字符流,它们分别是InputStreamReaderOutputStreamWriter。

1.1🔓转换输出流

1.1.1🔑定义

OutputStreamWriterWriter的子类,它可以将一个字节输出流转换成字符输出流,方便直接写入字符。

1.1.2🔑构造方法

1.1.3🔑成员方法

1.1.4🔑实例练习

🚩(OutputStreamWriter)实例练习

代码如下👇🏻 

package OutputStreamWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class OutputStreamWriterDemo {
	public static void main(String[] args) throws IOException {
		 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
		 "a.txt")); // 默认GBK
		// OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
		// "a.txt"), "GBK"); // 指定GBK
//		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
//				"a.txt"), "UTF-8"); 指定UTF-8
		osw.write("中国");
		osw.close();
	}
}

 运行结果👇🏻

1.2🔓转换输入流

1.2.1🔑定义

InputStreamReaderReader的子类,它可以将一个字节输入流转换成字符输入流,方便直接读取字符。

1.2.2🔑构造方法

1.2.3🔑成员方法

1.2.4🔑实例练习

🚩(InputStreamReader)实例练习

代码如下👇🏻 

package InputStreamReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class InputStreamReaderDemo {
	public static void main(String[] args) throws IOException {
		 InputStreamReader isr = new InputStreamReader(new FileInputStream(
		 "a.txt"));
		// InputStreamReader isr = new InputStreamReader(new FileInputStream(
		// "a.txt"), "GBK");
//		InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"), "UTF-8");
		// 一次读取一个字符
		int ch = 0;
		while ((ch = isr.read()) != -1) {
			System.out.print((char) ch);
		}
		isr.close();
	}
}

运行结果👇🏻

注意:

(1).需要读和写的字符编码一致才能正确输出,否则则是乱码。

(2).默认字符编码为GBK。

二.🔐RandomAccessFile类

RandomAccessFile类不属于流,是Object类的子类。

 但它融合了InputStreamOutputStream的功能,支持对文件的随机访问读取写入

2.1.1🔑构造方法

 RandomAccessFile(String name,String mode):第一个参数是文件路径,第二个参数是操作文件的模式。模式有四种,我们最常用的一种叫"rw"。

2.2.2🔑成员方法

2.2.3🔑实例练习

🚩实例练习(写入)

代码如下👇🏻 

package RandomAccessFile;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileDemo {
	public static void main(String[] args) throws IOException {
		 write();
	}
	private static void write() throws IOException {
		// 创建随机访问流对象
		RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");
		raf.writeInt(100);//4个字节
		raf.writeChar('a');//2个字节
		raf.writeUTF("中国");//6个字节  编码标记+2字节
		raf.close();
	}
}

 运行结果👇🏻

🚩实例练习(读取)

原理:RandomAccessFile对象包含了一个记录指针来标识当前读写处的位置。

(1).当新建RandomAccessFile对象时,该对象的文件记录指针会在文件开始处(即标识为0的位置)。

(2).当读写了n个字节后,文件记录指针会向后移动n个字节。

(3).除了按顺序读写外,RandomAccessFile对象还可以自由的移动记录指针,既可以向前移动,也可以向后移动。

代码如下👇🏻 

package RandomAccessFile;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileDemo1 {
	public static void main(String[] args) throws IOException {
		 read();
	}
	private static void read() throws IOException {
		RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");
		int i = raf.readInt();
		System.out.println(i);
         //该文件指针可以通过 getFilePointer方法读取,并通过 seek 方法设置。
		System.out.println("当前文件的指针位置是:" + raf.getFilePointer());
		char ch = raf.readChar();
		System.out.println(ch);
		System.out.println("当前文件的指针位置是:" + raf.getFilePointer());
		String s = raf.readUTF();
		System.out.println(s);
		System.out.println("当前文件的指针位置是:" + raf.getFilePointer());
//      读的字符随机
//		raf.seek(4);
//		ch = raf.readChar();
//		System.out.println(ch);
	}
}

 运行结果👇🏻

三.🔐对象序列化

3.1🔓前言

程序在运行过程中,可能需要将一些数据永久的保存到磁盘上,而数据在Java中都是保存在对象当中的。那么我们要怎样将对象中的数据保存到磁盘上呢?这时就需要使用Java中的对象序列化

3.1.1🔑定义

对象的序列化(Serializable)是指将一个Java对象转换成一个I/O流中字节序列的过程。

3.1.2🔑目的

为了将对象保存到磁盘中,或允许在网络中直接传输对象。

3.1.3🔑说明

(1).对象序列化可以使内存中的Java对象转换成与平台无关的二进制流。

(2).既可以将这种二进制流持久地保存在磁盘上,又可以通过网络将这种二进制流传输到另一个网络节点。

(3).其他程序在获得了这种二进制流后,还可以将它恢复成原来的Java对象。

这种将I/O流中的字节序列恢复为Java对象的过程被称之为反序列化(Deserialize)。

3.2🔓序列化流

3.2.1🔑定义

 序列化流(ObjectOutputStream):

[对象 -- 流数据]把对象按照流一样的方式存入文本文件或者在网络中传输。

3.2.2🔑实例练习

代码如下👇🏻 

先创建一个对象Person

package ObjectStream;
import java.io.Serializable;
public class Person implements Serializable {

	private String name;
	private int age;

	public Person() {
		super();
	}

	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	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;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}

再创建测试类ObjectStreamDemo

package ObjectStream;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class ObjectStreamDemo {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		 write();
	}

	private static void write() throws IOException {
		// 创建序列化流对象
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt"));

		// 创建对象
		Person p = new Person("小明", 18);

		oos.writeObject(p);

		// 释放资源
		oos.close();
	}
}

3.3🔓反序列化流

3.3.1🔑定义

反序列化流(ObjectInputStream):

[流数据 -- 对象]把文本文件中的流对象数据或者网络中的流对象数据还原成对象。

3.3.2🔑实例练习

package ObjectStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class ObjectStreamDemo1 {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		read();
	}
	
	private static void read() throws IOException, ClassNotFoundException {
		// 创建反序列化对象
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt"));

		// 还原对象
		Object obj = ois.readObject();

		// 释放资源
		ois.close();

		// 输出对象
		System.out.println(obj);
	}
}

🌺建议大家亲自动手操作,学编程,多实践练习是提升编程技能的必经之路。欢迎大家在评论区进行讨论和指正

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

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

相关文章

【算法与设计模式】

一、数据结构与算法 1、算法性能评估 时间复杂度、空间复杂度 2、数据结构 数组与列表 队列 堆栈 链表 二叉树 多叉树 递归算法 二、设计模式 1、单例 (1)GIL:线程互斥锁。保证同一时刻只有一个线程在进行。 (2&#xff09…

嵌入式CTS测试

1.概述 CTS是一套开源测试套件,可以实现对OpenGL、ES、OpenCL、Vulkan的兼容性测试。OpenGL ES CTS的测试集,其测试用例涵盖了各种OpenGL ES 的功能和特性。这些功能包括着色器编译和链接、图元绘制、纹理操作、帧缓冲操作、深度测试、模板测试以及其他一…

中国智能驾驶的“突围赛”打响,这家本土厂商为何能成为“先行者”?

中国本土厂商正在成为全球智能汽车产业链的“核心力量”。 根据《高工智能汽车研究院》数据显示,今年1-6月,自主品牌标配L2(含L2)级辅助驾驶交付新车155.34万辆。其中,搭载中国本土智能驾驶解决方案提供商&#xff08…

Clickhouse 学习笔记(6)—— ClickHouse 分片集群

前置知识: Clickhouse学习笔记(5)—— ClickHouse 副本-CSDN博客 与副本对比: 副本虽然能够提高数据的可用性,降低丢失风险,但是每台服务器实际上必须容纳全量数据,对数据的横向扩容没有解决 …

自适应AI chatGPT智能聊天创作官网html源码/最新AI创作系统/ChatGPT商业版网站源码

源码简介: 自适应AI chatGPT智能聊天创作官网html源码,这是最新AI创作系统,作为ChatGPT商业版网站源码,它是支持创作、编写、翻译、写代码等。是一个智能聊天系统项目源码。 注意:这个只是网站html源码,要…

leetcode 刷题 - 有效三角形个数 - 长度最小的子数组 - 无重复字符的最长子串

l611. 有效三角形的个数 - 力扣(LeetCode) 给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。 示例 1:输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3示…

【vue】vue项目批量下载二维码,且打包成压缩包.

一. 先看效果演示 二. 下插件 npm i vue-qr -S // 二维码显示插件 我的版本^4.0.9 npm i html2canvas -S // 将二维码转为图片 我的版本^1.4.1 npm i file-saver -S // 下载图片 我的版本^2.0.5 npm i jszip -S // 打包成压缩包 我的版本^3.10.1 // 一次性下载 npm i vue-qr h…

利用中断做数码表

功能要求:1.按下KEY1,显示数字开始每0.5秒加1,加到(10学号)返回0,0显示2秒后继续开始重复加1。 2. 任何时候按下KEY2数字清零,并停止加1。 3. KEY1和KEY2分别采用查询和外部中断方式。 要求程序中有硬件…

最新宝塔面板第三方云端站点程序源码/第三方宝塔面板PHP源码/全开源ThinkPHP框架

源码简介: 实现宝塔面板第三方云端站点程序源码,这个是第三方宝塔面板 btcloud PHP源码,它还有云端使用记录、IP黑白名单、定时任务等功能。 这是一个使用PHP开发的宝塔面板第三方云端站点程序。 您可以利用此程序搭建属于自己的宝塔面板第三方云端&a…

Springboot+vue的高校办公室行政事务管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的高校办公室行政事务管理系统(有报告)。Javaee项目,springboot vue前后端分离项目 项目介绍: 本文设计了一个基于Springbootvue的高校办公室行政事务管理系统,采用M(m…

九种常用二次曲面的构造过程

九种常用二次曲面的构造过程 1.九种常用二次曲面的构造过程1.1 椭圆锥面1.2 椭球面1.3 单叶双曲面1.4 双叶双曲面1.5 椭圆抛物面1.6 双曲抛物面(马鞍面)1.7 椭圆柱面1.8 双曲柱面1.9 抛物柱面 1.九种常用二次曲面的构造过程 声明:部分截图来自…

【算法-哈希表1】哈希表有什么用? 来看看 有效的字母异位词 和 两数组的交集.

今天,带来哈希相关算法的讲解。文中不足错漏之处望请斧正! 理论基础点这里 有效的字母异位词 1. 思路 暴力的解法,需要两层for循环,同时还要记录字符是否重复出现,很明显时间复杂度是 O(n^2)。 其实可以用哈希表来…

mac 无法 push 代码到 github 报错:Couldn‘t connect to server 或者 无法克隆 github 仓库 ,克隆进度卡住

开启代理后上传代码报错 Failed to connect to github.com port 443 after 75108 ms: Couldn’t connect to server 解决方法 在 网络 设置里查看代理端口号 开启配置 http、https 全局代理 git config --global http.proxy http://127.0.0.1:你所查询的端口号 git confi…

【安卓13】谷歌原生桌面launcher3源码修改,修改桌面布局(首屏应用、小部件、导航栏、大屏设备任务栏)

前言 近期接到一个关于谷歌EDLA认证的需求,我负责的是谷歌原生桌面布局的修改,通过研究源码,将涉及到了一些修改思路发出来,大家可以参考一下有没有对你有用的信息。主要修改内容有: 1、搜索栏、底部导航栏未居中 2、…

吴恩达《机器学习》7-1->7-4:过拟合问题、代价函数、线性回归的正则化、正则化的逻辑回归模型

一、过拟合的本质 过拟合是指模型在训练集上表现良好,但在新数据上的泛化能力较差。考虑到多项式回归的例子,我们可以通过几个模型的比较来理解过拟合的本质。 线性模型(欠拟合): 第一个模型是一个线性模型&#xff0…

熊海CMS 靶场

熊海CMS 靶场 0x01 前言 初步了解cms,Content Management System 内容管理系统。它是一种用于创建、编辑、管理和发布内容的软件程序或工具。内容管理系统通常用于网站、博客、企业内部系统等各种应用中,可以帮助用户管理和发布各种类型的内容&#xf…

Clickhouse学习笔记(5)—— ClickHouse 副本

Data Replication | ClickHouse Docs 副本的目的主要是保障数据的高可用性,即使一台 ClickHouse 节点宕机,那么也可以从其他服务器获得相同的数据 注意: clickhouse副本机制的实现要基于zookeeperclickhouse的副本机制只适用于MergeTree f…

一起看看StatusBarManagerService(一)

写在前面 工作需要涉及到这部分代码,但是我对此了解很少;边学边总结,把这部分逻辑和涉及到的知识点弄明白。该系列不确定几篇,随缘。 本篇主要介绍StatusBarManagerService与systemui之间的关联。 了解StatusBarManagerService …

[Android]_[初级]_[配置gradle的环境变量设置安装位置]

场景 在开发Android项目的时候, gradle是官方指定的构建工具。不同项目通过wrapper指定不同版本的gradle。随着项目越来越多,使用的gradle版本也增多,导致它以来的各种库也增加,系统盘空间不足,怎么解决? 说明 grad…

pyqt环境搭建

创建虚拟环境 # 用管理员身份运行 conda create --prefixE:\Python\envs\pyqt5stu python3.6 # 激活虚拟环境 conda activate E:\Python\envs\pyqt5stu # 退出虚拟环境 conda deactivate安装包 pip install PyQt5 -i https://pypi.douban.com/simple pip install PyQt5-tools…