21-CS61B-lab6:java文件操作以及持久化一见
文件操作
这里的文件操作主要通过File类,Serializable的派生类等实现
拥有路径path(相对路径/绝对路径),创建File对象
File newFile = new File(path);
获得当前工作目录File
File CWD = new File(System.getProperty("user.dir"));
通过System.getProperty("user.dir")得到的是CWD的绝对路径
注:工作目录为运行Main.class的目录,并非储存Main.class的目录
例如Main.class放在Main目录,我在lab6使用命令行java Main.Main,那么CWD得到的是lab6
获得File对象的路径的String形式
String path = CWD.getPath();
拥有路径中的多个目录名,想转换为File对象
File newFile = Paths.get(CWD.getPath(), dir1, dir2, dir3).toFile();
检查File对象所指向的文件/目录是否已创建
newFile.exists();
检查File对象所指向的是否为文件
newFile.isFile();
检查File对象指向的是否为目录
newFile.isDirectory();
将File指向的文件创建
try {newFile.createNewFile();
} catch (IOException e) {throw new RuntimeException(e);
}
将File指向的目录创建
newFile.mkdir();
将byte[]类写入文件
/*** @param newFile 要写入的文件* @param contents 要写入的内容对象,这里默认implements byte[]*/
static void writeContents(File newFile, Object... contents) {BufferedOutputStream str = new BufferedOutputStream(Files.newOutputStream(newFile.toPath()));for (Object obj : contents) {str.write((byte[]) obj);{str.close();
}
将String类转换为byte[]类
((String) obj).getBytes(StandardCharsets.UTF_8)
读取二进制文件
byte[] byteResult = Files.readAllBytes(newFile.toPath());
将byte[]类转换为String类
String StringResult = new String(byteResult, StandardCharsets.UTF_8);
对象的序列化
序列化对象指的是将对象转换成byte[]数组保存其信息
obj一定要implements Serializable
static byte[] serialize(Serializable obj) {ByteArrayOutputStream stream = new ByteArrayOutputStream(); ObjectOutputStream objectStream = new ObjectOutputStream(stream);objectStream.writeObject(obj); //写入,被stream接收objectStream.close(); //关闭Object流return stream.toByteArray(); //转换为byte[]
}
将对象写入文件
即序列化后写入文件
writeContents(newFile, serialize(obj));
从序列化文件中读取对象
/***@Param file 待读的文件*@Param expectedClass 期望返回的对象类型*/
static <T extends Serializable> T readObject(File file, Class<T> expectedClass) {ObjectInputStream in =new ObjectInputStream(new FileInputStream(file)); //使用in读取ObjectT result = expectedClass.cast(in.readObject()); //cast到期望的类上in.close();return result;
}
持久化
持久化的目的是使我们的程序有记忆,在下次运行的时候,能够继承上次运行的状态继续运行
实现的方式很简单,即将我们需要保存的对象状态作为文件记录在磁盘当中,下次运行时读取该文件恢复对象状态。
CapersRepository.java的若干方法实现
void CapersRepository.setupPersistence();
public static void setupPersistence() {if (!CAPERS_FOLDER.exists()) {CAPERS_FOLDER.mkdir();}File STORY = join(CAPERS_FOLDER, "story");if (!STORY.exists()) {try {STORY.createNewFile();} catch (IOException e) {throw new RuntimeException(e);}}File DOGS = join(CAPERS_FOLDER, "dogs");if (!DOGS.exists()) {DOGS.mkdir();}
}
void CapersRepository.writeStory(String);
public static void writeStory(String text) {File STORY = join(CAPERS_FOLDER, "story");String writeString = readContentsAsString(STORY);if (writeString.isEmpty()) {writeString = text;} else {writeString = writeString + "\n" + text;}writeContents(STORY, writeString);System.out.println(writeString);
}
void CapersRepository.makeDog(String, String, int);
public static void makeDog(String name, String breed, int age) {Dog dogObj = new Dog(name, breed, age);dogObj.saveDog();System.out.println(dogObj);
}
void CapersRepository.celebrateBirthday(String);
public static void celebrateBirthday(String name) {Dog dogObj = Dog.fromFile(name);if (dogObj != null) {dogObj.haveBirthday();dogObj.saveDog();}
}
Dog.java的若干方法实现
Dog Dog.FromFile(String);
public static Dog fromFile(String name) {File dogObj = join(DOG_FOLDER, name);if (!dogObj.exists()) {return null;}return readObject(dogObj, Dog.class);
}
void saveDog();
public void saveDog() {File dog = join(DOG_FOLDER, name);if (!dog.exists()) {try {dog.createNewFile();} catch (IOException e) {throw new RuntimeException(e);}}writeObject(dog, this);
}
相关文章:
21-CS61B-lab6:java文件操作以及持久化一见
文件操作 这里的文件操作主要通过File类,Serializable的派生类等实现 拥有路径path(相对路径/绝对路径),创建File对象 File newFile new File(path); 获得当前工作目录File File CWD new File(System.getProperty("user.dir")); 通过S…...
⚡️ Linux 系统安装与配置 Git
⚡️ Linux 系统安装与配置 Git 📘 1. Git 简介 Git 是目前世界上最流行的分布式版本控制系统,他能高效地处理从小型到大型项目的版本管理需求,是现代软件开发流程中的核心工具之一。 在企业环境中,大多数公司通常会在 Linux 服…...
SpringBoot 自动装配原理深度解析:从源码到实践
SpringBoot 自动装配原理深度解析:从源码到实践 SpringBoot 作为现代 Java 开发的事实标准,其核心优势之一是 “约定大于配置” 的自动装配机制。本文将从源码层面深入解析 SpringBoot 自动装配的实现原理,并通过代码示例展示其工作流程。 …...

【Go语言】Fyne GUI 库使用指南 (面向有经验开发者)
引言 Fyne 是一个使用 Go 语言编写的、易于使用的跨平台 GUI 工具包和应用程序 API。它旨在通过单一代码库构建在桌面和移动设备上运行的应用程序。本文档面向有一定 Go 语言开发经验的开发者,将详细介绍 Fyne 最新版的核心功能,包括基础组件、布局系统…...
Nginx Lua模块(OpenResty)实战:动态化、智能化你的Nginx,实现复杂Web逻辑 (2025)
更多服务器知识,尽在hostol.com 嘿,各位Nginx的“铁杆粉丝”和“配置大师”们!咱们都知道,Nginx以其超凡的性能、稳定性和丰富的模块化功能,在Web服务器、反向代理、负载均衡等领域独步青云,简直是服务器软…...

openssl 怎么生成吊销列表
mkdir test cd test # 根据 /usr/lib/ssl/openssl.cnf 配置文件中目录结构可知有个demoCA目录,目录下有各种文件。 mkdir ./demoCA ./demoCA/newcerts ./demoCA/private sudo chmod 777 -R ./demoCA/ echo 01 > ./demoCA/serial touch ./demoCA/index.txt # /usr…...
Go语言包的组织与导入 -《Go语言实战指南》
在 Go 语言中,包(Package) 是管理代码模块化、复用性与可维护性的核心单位。本章将讲解如何组织包结构、如何导入其他包、以及项目中的最佳实践。 一、什么是包? • 每个 .go 文件都属于某个包(通过 package 声明&…...

springboot-响应接收与ioc容器控制反转、Di依赖注入
1.想将服务器中的数据返回给客户端,需要在controller类上加注解:ResponseBody; 这个注解其实在前面已经使用过,RestController其实就包含两个注解: Controller ResponseBody 返回值如果是实体对象/集合,将会转换为j…...
CSP使用严格设置
文章目录 说明示例 说明 日期:2025年6月2日。 内容安全政策(MPS)是一个额外的安全层,有助于检测和缓解某些类型的攻击。包括(但不限于)跨站点脚本(XSS)和数据注入攻击。这些攻击用…...

Spring代理工厂类ProxyFactory作用以及实现原理
代理工厂类ProxyFactory AdvisedSupport(代理配置信息类)ProxyFactory(代理工厂类)小结测试 源码见:mini-spring 在 AOP(面向切面编程)中,Spring 支持两种常见的代理机制:…...
SpringBoot使用MQTT协议简述
在 Spring Boot 中使用 MQTT 协议连接硬件设备,可以通过以下步骤实现。这里以 Eclipse Paho MQTT 客户端为例: 1. 添加 Maven 依赖 <dependencies><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boo…...
【GraphQL】深入解析 Apollo Client:从架构到实践的一站式 GraphQL 解决方案
深入解析 Apollo Client:从架构到实践的一站式 GraphQL 解决方案 1. 引言 GraphQL 作为现代 API 开发的核心技术,其灵活性和高效性正在重塑数据交互模式。Apollo Client 作为 GraphQL 生态中最受欢迎的客户端库,凭借强大的缓存机制、框架集…...

集成电路制造设备防震基座选型指南:为稳定护航-江苏泊苏系统集成有限公司
集成电路制造设备防震基座选型指南:为稳定护航 在集成电路制造这一精密复杂的领域,每一个环节都如同精密仪器中的微小齿轮,一丝偏差都可能导致严重后果。制造设备的稳定运行更是重中之重,而防震基座作为守护设备稳定的第一道防线…...

华为OD机试真题——阿里巴巴找黄金宝箱(II)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…...
Vue中 toRaw 和 markRaw 的使用
背景 针对一些特殊的需求,在项目里,需要将响应式数据变为普通原始类型数据,这种情况是有的 在 Vue 中,能够将普通数据类型的数据变为响应式数据,也能将响应式类型数据变为普通类型数据,用于提升数据的性能…...

探索DeepSeek提示词:关键策略与实用场景
在人工智能飞速发展的时代,DeepSeek作为一款备受关注的AI工具,其强大的功能为用户提供了高效便捷的服务。然而,要充分发挥DeepSeek的潜力,掌握提示词的使用策略至关重要。本文将深入探讨DeepSeek提示词的关键策略,并结…...

海底三维可视化平台
1. 摘要 本文作者为视觉分析构建了一个真实海底的“虚拟世界”。在3D环境中导入底部轮廓。在该模型中,通过地震反射获得的海床地层剖面被数字化为离散点,并用克里金算法进行插值,以在每个地层中产生均匀的网格。然后在每一层构建 Delaunay三…...

Elasticsearch 读写流程深度解析
在数据驱动的数字化浪潮中,Elasticsearch 凭借其毫秒级搜索响应与水平扩展能力,已成为现代数据架构的核心引擎。本文将深入剖析其读写流程的设计思想、实现细节与工程权衡,揭示这一分布式系统的精妙架构。 一、 架构基石:分布式设…...

AIoT赋能场馆数字化转型:智能管理新生态
在数字化浪潮席卷全球的当下,传统场馆管理模式已难以满足日益增长的高效运营与精细化服务需求。智慧场馆建设成为行业发展的必然趋势,而AIoT(人工智能物联网)技术的深度应用,为多系统集成提供了全新的解决方案…...

1、Pytorch介绍与安装
1、Pytorch介绍 PyTorch 是由 Facebook AI Research (FAIR) 团队开发并维护的一款开源深度学习框架,于 2016 年首次发布。它因其直观的设计、卓越的灵活性以及强大的动态计算图功能,迅速在学术界和工业界获得了广泛认可,成为当前深度学习研究…...

【从零开始学习QT】Qt 概述
目录 一、什么是 Qt 1.1 简介 1.2 Qt 的发展史 1.3 Qt 支持的平台 1.5 Qt 的优点 1.6 Qt 的应用场景 二、搭建 Qt 开发环境 2.1 Qt SDK 的下载 2.2 Qt SDK 的安装 2.3 验证 Qt SDK 安装是否成功 2.4 Qt 环境变量配置 三、认识 Qt Creator 3.1 Qt Creator 概览 3.…...

家庭路由器改装,搭建openwrt旁路由以及手机存储服务器,实现外网节点转发、内网穿透、远程存储、接入满血DeepSeek方案
大家好,也是好久没有发文了,最近在捣鼓一些比较有趣的东西,打算跟大家分享一下! 先聊一下我的大致方案嘛,最近感觉家里路由器平时一直就只有无线广播供网的功能,感觉这么好的一下嵌入式设备产品不应该就干这…...
人工智能工程技术专业 和 其他信息技术专业 有哪些关联性?
人工智能工程技术专业与其他信息技术专业之间存在紧密的关联性,这些关联既体现在基础理论、技术体系上,也反映在行业应用和技术融合的趋势中。以下从多个维度解析它们的关联性: 一、基础学科与核心技术的共通性 数学与算法基础 关联专业&…...

基于本地模型+多级校验设计的高效缓存,有效节省token数量(有点鸡肋doge)。
前言 我是基于token有限而考虑的一个省钱方案,还能够快速返回结果,但是劣势也很明显,设计不好容易出问题,就如下面所介绍的语义飘逸和缓存污染,我认为在自己学习大模型的过程用来省钱非常可以,再加上学习过…...

逐步检索增强推理的跨知识库路由学习
摘要 多模态检索增强生成(MRAG)在多模态大语言模型(MLLM)中通过在生成过程中结合外部知识来减轻幻觉的发生,已经显示出了良好的前景。现有的MRAG方法通常采用静态检索流水线,该流水线从多个知识库ÿ…...
用Git管理你的服务器配置文件与自动化脚本:版本控制、变更追溯、团队协作与安全回滚的运维之道
更多服务器知识,尽在hostol.com 咱们在和服务器打交道的日子里,是不是经常要和各种各样的配置文件(Nginx的、Apache的、PHP的、防火墙的……)还有自己辛辛苦苦写下的自动化脚本打交道?那你有没有遇到过这样的“抓狂”…...

【数据库】关系数据库标准语言-SQL(金仓)下
4、数据查询 语法: SELECT [ALL | DISTINCT] <目标列表达式> [,<目标列表达式>] … FROM <表名或视图名>[, <表名或视图名> ] … [ WHERE <条件表达式> ] [ GROUP BY <列名1> [ HAVING <条件表达式> ] ] [ ORDER BY <…...

Vue3+SpringBoot全栈开发:从零实现增删改查与分页功能
前言 在现代化Web应用开发中,前后端分离架构已成为主流。本文将详细介绍如何使用Vue3作为前端框架,SpringBoot作为后端框架,实现一套完整的增删改查(CRUD)功能,包含分页查询、条件筛选等企业级特性。 技术栈介绍 前端࿱…...

小黑大语言模型应用探索:langchain智能体构造源码demo搭建1(初步流程)
导入工具包 rom langchain_core.tools import BaseTool from typing import Sequence, Optional, List from langchain_core.prompts import BasePromptTemplate import re from langchain_core.tools import tool from langchain_core.prompts.chat import (ChatPromptTempla…...

极客时间:用 FAISS、LangChain 和 Google Colab 模拟 LLM 的短期与长期记忆
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...