零基础学Java——第十一章:实战项目 - 控制台应用开发
第十一章:实战项目 - 控制台应用开发
在前面的章节中,我们已经学习了Java的基础知识、面向对象编程、高级特性、文件IO、多线程、网络编程和数据库操作等内容。现在,是时候将这些知识应用到实际项目中了。本章我们将从最基础的控制台应用开始,学习如何开发一个完整的Java项目。
1. 控制台应用概述
控制台应用是最基础的应用类型,它通过命令行界面与用户交互,不需要图形界面。虽然看起来简单,但控制台应用可以实现复杂的功能,而且是学习编程的理想起点。
1.1 控制台应用的特点
- 简单直接:无需复杂的UI设计,专注于核心功能实现
- 开发效率高:开发周期短,适合快速验证想法
- 资源消耗低:运行时占用系统资源少
- 适合后台服务:很多服务器端程序都是以控制台形式运行的
- 调试方便:输出结果直观,便于调试
1.2 常见的控制台应用类型
- 文本处理工具
- 数据分析程序
- 简单游戏(如猜数字、文字冒险等)
- 系统工具(如文件管理器、备份工具等)
- 数据库管理工具
2. 项目实战:学生信息管理系统
接下来,我们将开发一个学生信息管理系统,这是一个典型的控制台应用,它能够帮助我们巩固之前学习的知识。
2.1 需求分析
我们的学生信息管理系统需要实现以下功能:
- 添加学生信息(学号、姓名、年龄、成绩等)
- 删除学生信息
- 修改学生信息
- 查询学生信息(按学号、姓名等条件查询)
- 显示所有学生信息
- 数据持久化(保存到文件)
- 数据加载(从文件读取)
2.2 系统设计
根据需求,我们可以设计以下几个类:
Student
:学生类,包含学生的基本信息StudentManager
:学生管理类,负责学生信息的增删改查FileHandler
:文件处理类,负责数据的读写Main
:主类,包含主菜单和程序入口
2.3 代码实现
2.3.1 Student类
package studentmanager;import java.io.Serializable;public class Student implements Serializable {private static final long serialVersionUID = 1L;private String id; // 学号private String name; // 姓名private int age; // 年龄private double score; // 成绩// 构造方法public Student(String id, String name, int age, double score) {this.id = id;this.name = name;this.age = age;this.score = score;}// getter和setter方法public String getId() {return id;}public void setId(String id) {this.id = id;}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 double getScore() {return score;}public void setScore(double score) {this.score = score;}@Overridepublic String toString() {return "学号: " + id + ", 姓名: " + name + ", 年龄: " + age + ", 成绩: " + score;}
}
2.3.2 StudentManager类
package studentmanager;import java.util.ArrayList;
import java.util.List;public class StudentManager {private List<Student> students;private FileHandler fileHandler;public StudentManager() {students = new ArrayList<>();fileHandler = new FileHandler();// 尝试从文件加载数据loadData();}// 添加学生public boolean addStudent(Student student) {// 检查学号是否已存在for (Student s : students) {if (s.getId().equals(student.getId())) {return false; // 学号已存在,添加失败}}students.add(student);saveData(); // 保存数据return true;}// 删除学生public boolean deleteStudent(String id) {for (int i = 0; i < students.size(); i++) {if (students.get(i).getId().equals(id)) {students.remove(i);saveData(); // 保存数据return true;}}return false; // 未找到该学生}// 修改学生信息public boolean updateStudent(String id, String name, int age, double score) {for (Student student : students) {if (student.getId().equals(id)) {student.setName(name);student.setAge(age);student.setScore(score);saveData(); // 保存数据return true;}}return false; // 未找到该学生}// 按学号查询学生public Student findStudentById(String id) {for (Student student : students) {if (student.getId().equals(id)) {return student;}}return null; // 未找到该学生}// 按姓名查询学生public List<Student> findStudentsByName(String name) {List<Student> result = new ArrayList<>();for (Student student : students) {if (student.getName().contains(name)) {result.add(student);}}return result;}// 获取所有学生public List<Student> getAllStudents() {return new ArrayList<>(students); // 返回副本,避免外部修改}// 保存数据到文件private void saveData() {fileHandler.saveStudents(students);}// 从文件加载数据private void loadData() {List<Student> loadedStudents = fileHandler.loadStudents();if (loadedStudents != null) {students = loadedStudents;}}
}
2.3.3 FileHandler类
package studentmanager;import java.io.*;
import java.util.ArrayList;
import java.util.List;public class FileHandler {private static final String FILE_NAME = "students.dat";// 保存学生数据到文件public void saveStudents(List<Student> students) {try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE_NAME))) {oos.writeObject(students);System.out.println("数据已成功保存到文件");} catch (IOException e) {System.out.println("保存数据时出错: " + e.getMessage());}}// 从文件加载学生数据@SuppressWarnings("unchecked")public List<Student> loadStudents() {File file = new File(FILE_NAME);if (!file.exists()) {return new ArrayList<>(); // 文件不存在,返回空列表}try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_NAME))) {List<Student> students = (List<Student>) ois.readObject();System.out.println("数据已成功从文件加载");return students;} catch (IOException | ClassNotFoundException e) {System.out.println("加载数据时出错: " + e.getMessage());return new ArrayList<>(); // 出错时返回空列表}}
}
2.3.4 Main类
package studentmanager;import java.util.List;
import java.util.Scanner;public class Main {private static StudentManager manager = new StudentManager();private static Scanner scanner = new Scanner(System.in);public static void main(String[] args) {boolean running = true;System.out.println("欢迎使用学生信息管理系统");while (running) {showMenu();int choice = getChoice();switch (choice) {case 1:addStudent();break;case 2:deleteStudent();break;case 3:updateStudent();break;case 4:findStudent();break;case 5:showAllStudents();break;case 0:running = false;System.out.println("感谢使用学生信息管理系统,再见!");break;default:System.out.println("无效的选择,请重新输入");}}scanner.close();}// 显示主菜单private static void showMenu() {System.out.println("\n========== 学生信息管理系统 ==========");System.out.println("1. 添加学生");System.out.println("2. 删除学生");System.out.println("3. 修改学生信息");System.out.println("4. 查询学生信息");System.out.println("5. 显示所有学生");System.out.println("0. 退出系统");System.out.print("请输入您的选择: ");}// 获取用户输入的选择private static int getChoice() {try {return Integer.parseInt(scanner.nextLine());} catch (NumberFormatException e) {return -1; // 输入无效}}// 添加学生private static void addStudent() {System.out.println("\n----- 添加学生 -----");System.out.print("请输入学号: ");String id = scanner.nextLine();System.out.print("请输入姓名: ");String name = scanner.nextLine();int age = 0;boolean validAge = false;while (!validAge) {System.out.print("请输入年龄: ");try {age = Integer.parseInt(scanner.nextLine());validAge = true;} catch (NumberFormatException e) {System.out.println("年龄必须是整数,请重新输入");}}double score = 0.0;boolean validScore = false;while (!validScore) {System.out.print("请输入成绩: ");try {score = Double.parseDouble(scanner.nextLine());validScore = true;} catch (NumberFormatException e) {System.out.println("成绩必须是数字,请重新输入");}}Student student = new Student(id, name, age, score);boolean success = manager.addStudent(student);if (success) {System.out.println("学生添加成功!");} else {System.out.println("添加失败,该学号已存在");}}// 删除学生private static void deleteStudent() {System.out.println("\n----- 删除学生 -----");System.out.print("请输入要删除的学生学号: ");String id = scanner.nextLine();boolean success = manager.deleteStudent(id);if (success) {System.out.println("学生删除成功!");} else {System.out.println("删除失败,未找到该学号的学生");}}// 修改学生信息private static void updateStudent() {System.out.println("\n----- 修改学生信息 -----");System.out.print("请输入要修改的学生学号: ");String id = scanner.nextLine();// 先查询该学生是否存在Student student = manager.findStudentById(id);if (student == null) {System.out.println("未找到该学号的学生");return;}System.out.println("当前学生信息: " + student);System.out.print("请输入新的姓名(直接回车保持不变): ");String name = scanner.nextLine();if (name.isEmpty()) {name = student.getName();}int age = student.getAge();System.out.print("请输入新的年龄(直接回车保持不变): ");String ageStr = scanner.nextLine();if (!ageStr.isEmpty()) {try {age = Integer.parseInt(ageStr);} catch (NumberFormatException e) {System.out.println("年龄格式无效,保持原值");}}double score = student.getScore();System.out.print("请输入新的成绩(直接回车保持不变): ");String scoreStr = scanner.nextLine();if (!scoreStr.isEmpty()) {try {score = Double.parseDouble(scoreStr);} catch (NumberFormatException e) {System.out.println("成绩格式无效,保持原值");}}boolean success = manager.updateStudent(id, name, age, score);if (success) {System.out.println("学生信息修改成功!");} else {System.out.println("修改失败");}}// 查询学生信息private static void findStudent() {System.out.println("\n----- 查询学生信息 -----");System.out.println("1. 按学号查询");System.out.println("2. 按姓名查询");System.out.print("请选择查询方式: ");int choice = getChoice();switch (choice) {case 1:findStudentById();break;case 2:findStudentsByName();break;default:System.out.println("无效的选择");}}// 按学号查询学生private static void findStudentById() {System.out.print("请输入学号: ");String id = scanner.nextLine();Student student = manager.findStudentById(id);if (student != null) {System.out.println("查询结果: " + student);} else {System.out.println("未找到该学号的学生");}}// 按姓名查询学生private static void findStudentsByName() {System.out.print("请输入姓名(支持模糊查询): ");String name = scanner.nextLine();List<Student> students = manager.findStudentsByName(name);if (students.isEmpty()) {System.out.println("未找到匹配的学生");} else {System.out.println("查询结果:");for (Student student : students) {System.out.println(student);}System.out.println("共找到 " + students.size() + " 名学生");}}// 显示所有学生private static void showAllStudents() {System.out.println("\n----- 所有学生信息 -----");List<Student> students = manager.getAllStudents();if (students.isEmpty()) {System.out.println("暂无学生信息");} else {for (Student student : students) {System.out.println(student);}System.out.println("共有 " + students.size() + " 名学生");}}
}
2.4 运行与测试
编译并运行上述代码,你将得到一个功能完整的学生信息管理系统。系统启动后,会显示主菜单,你可以通过输入相应的数字来执行不同的操作。
系统会将学生数据保存到当前目录下的students.dat
文件中,下次启动时会自动加载这些数据。
2.5 项目扩展思路
- 添加更多学生属性:如性别、班级、联系方式等
- 实现成绩管理:添加多门课程的成绩记录和统计功能
- 添加用户认证:实现登录功能,区分管理员和普通用户权限
- 优化数据存储:使用数据库替代文件存储,提高数据管理能力
- 添加数据导出功能:支持将数据导出为CSV或Excel格式
- 添加数据统计分析:如成绩分布、平均分计算等
3. 控制台应用开发的最佳实践
3.1 用户界面设计
虽然是控制台应用,但良好的用户界面设计仍然很重要:
- 清晰的菜单结构:主菜单和子菜单层次分明
- 友好的提示信息:每一步操作都有明确的提示
- 错误处理:对用户输入进行验证,给出友好的错误提示
- 操作确认:对重要操作(如删除)进行确认
- 分页显示:数据量大时分页显示,避免信息过多
3.2 代码组织
- 模块化设计:将不同功能划分为不同的类和方法
- 单一职责原则:每个类只负责一项功能
- 封装实现细节:隐藏内部实现,只暴露必要的接口
- 注释完善:关键代码添加注释,提高可读性
- 异常处理:合理处理可能出现的异常情况
3.3 性能优化
- 减少IO操作:频繁的文件读写会影响性能
- 使用合适的数据结构:根据需求选择合适的集合类
- 避免不必要的对象创建:重用对象,减少垃圾回收压力
- 延迟加载:只在需要时才加载数据
- 批量处理:将多个操作合并处理,减少交互次数
4. 从控制台应用到其他类型应用的过渡
控制台应用是学习Java编程的起点,掌握了控制台应用开发后,你可以逐步过渡到其他类型的应用:
- 桌面应用:使用Swing或JavaFX开发图形界面应用
- Web应用:使用Servlet、JSP或Spring框架开发Web应用
- 移动应用:使用Android开发移动应用
- 微服务:使用Spring Boot、Spring Cloud开发微服务应用
无论开发哪种类型的应用,核心业务逻辑的设计思想是相通的,控制台应用中学到的模块化设计、数据处理、异常处理等知识都可以应用到其他类型的应用开发中。
5. 总结
本章我们通过开发一个学生信息管理系统,学习了控制台应用的开发流程和技巧。这个项目综合运用了前面章节学习的Java基础知识、面向对象编程、文件IO等内容,是一个很好的实践项目。
控制台应用虽然简单,但它是学习编程的重要基础,掌握了控制台应用开发,你就具备了开发其他类型应用的基础能力。在接下来的章节中,我们将学习如何开发桌面应用、Web应用等更复杂的应用类型。
6. 练习题
- 在学生信息管理系统的基础上,添加学生成绩排序功能(按成绩从高到低排序)。
- 扩展系统,添加班级管理功能,每个学生属于一个班级,可以按班级查询学生。
- 实现一个简单的文本编辑器,支持创建、打开、编辑和保存文本文件。
- 开发一个简单的通讯录程序,支持联系人的增删改查和数据持久化。
- 设计一个简单的银行账户管理系统,支持开户、存款、取款、转账和查询余额等功能。
7. 参考资源
- 《Java核心技术卷I》第11章:用户界面编程
- 《Effective Java》第3版:第8条:避免使用终结方法和清除方法
- Oracle Java Tutorials: Console I/O
- GitHub: Java Console Applications Examples
- Stack Overflow: Java Console Application Best Practices
相关文章:
零基础学Java——第十一章:实战项目 - 控制台应用开发
第十一章:实战项目 - 控制台应用开发 在前面的章节中,我们已经学习了Java的基础知识、面向对象编程、高级特性、文件IO、多线程、网络编程和数据库操作等内容。现在,是时候将这些知识应用到实际项目中了。本章我们将从最基础的控制台应用开始…...
从逻辑学视角理解统计学在数据挖掘中的作用
文章目录 一、引言:逻辑学与统计学的交汇1.1 问题的逻辑本质:为什么需要统计学解析数据1.2 数据挖掘中的三重逻辑关系:数据-模式-知识 二、统计学的逻辑基础2.1 归纳逻辑与统计推断2.2 假设检验的逻辑结构2.3 概率论:不确定性的逻…...
Cluster Interconnect in Oracle RAC
Cluster Interconnect in Oracle RAC (文档 ID 787420.1)编辑转到底部 In this Document Purpose Scope Details Physical Layout of the Private Interconnect Why Do We Need a Private Interconnect ? Interconnect Failure Interconnect High Availability Private Inte…...
OPENSSL-1.1.1的使用及注意事项
下载链接: OpenSSL1.1.1一个广泛使用的开源加密库资源-CSDN文库 OpenSSL 1.1.1 是一个广泛使用的开源加密库,以下是其使用方法及注意事项: 使用方法 安装: Linux系统: 从源码编译安装:访问 OpenSSL 官网…...
Element-UI字体图标不显示
原因 我在控制台查看请求后,发现elementUI的字体文件请求路径不对, 我的路径是/static/css/static/fonts/element-icons.535877f.woff, 正确的是/static/fonts/element-icons.535877f.woff 解决 build - utils function generateLoaders (loa…...
lambda 表达式
C 的 lambda 表达式 是一种轻量、内联的函数对象写法,广泛用于标准算法、自定义回调、事件响应等场景。它简洁且强大。以下将系统、详细地讲解 lambda 的语法、捕获规则、应用技巧和实际使用场景。 🧠 一、基本语法 [捕获列表](参数列表) -> 返回类型…...
vue3: pdf.js 2.16.105 using typescript
npm create vite vuepdfpreview //创建项目npm install vue-pdf-embed npm install vue3-pdfjs npm install pdfjs-dist2.16.105 <!--* |~~~~~~~|* | |* | |…...
自然语言处理-词性标注的基本概念
在自然语言处理过程中,进行词性标注是很有必要的一个步骤,词性揭示了一个词的类别,识别每个词的词性可以分析句子的语法和结构,从而为后续的命名实体识别、句法分析、情感分析、信息抽取以及机器翻译等文本分析任务提供必要且有用…...
电机密集型工厂环境下的无线通信技术选型与优化策略
点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 在电机、变频器、电焊机等强电磁干扰源遍布的工业环境中,无线通信系统的可靠性面临严峻挑战。本文从抗干扰能力、传输稳定性、实时性需求三大核心维度出发,结合工…...
【软件安装那些事 2 】Multisim 14.3 安装教程(中文版)步骤完整不跳步 { 附百度网盘中软件提取下载链接,永久有效 }
百度网盘分享的文件:Multisim 14.3 安装包 中文 (永久有效) 链接: https://pan.baidu.com/s/1XE4X9_M496lyHCN3DGrOzw?pwd4yku 提取码: 4yku 1、解压完成后,打开【Setup】文件夹 2、右击【Install】,选择…...
NextDenovo2.5.2安装与使用-生信工具53
01 NextDenovo 简介 适用于三代数据基因组组装! NextDenovo 是一个基于字符串图(String Graph)的长读段(如 PacBio CLR, ONT)从头组装工具。它采用类似于 Canu 的“先纠错后组装”(correct-th…...
结构性变革与新兴机遇
近年来,全球就业市场正经历深刻的结构性变革。受技术进步、产业升级、人口结构变化及全球经济格局调整的影响,传统就业模式被重塑,新的职业机会不断涌现。本文将分析当前就业市场的主要趋势,并探讨其对劳动者、企业和政策制定者的…...
第20篇:Linux设备驱动程序入门<七>
Q:如何编写定时器中断驱动内核模块? A:使用在FPGA中实现的间隔定时器FPGA Timer0,寄存器接口基地址为0x00002000,时钟频率100MHz,中断ID为72。调用这个定时器需要向Counter start value寄存器写入适当的值…...
基于Transformer与SHAP可解释性分析的神经网络回归预测模型【MATLAB】
基于Transformer与SHAP可解释性分析的神经网络回归预测模型【MATLAB】 在当今的数据科学与人工智能领域,构建一个高精度的预测模型固然重要,但越来越多的应用场景开始关注模型的可解释性。尤其在金融、医疗、工业控制等对决策透明度要求较高的领域&…...
基于Java和GeoTools的根据矢量BBOx自动生成格网文件实践
目录 前言 一、基础数据介绍及生成方法简介 1、矢量数据处理 2、格网生成算法 二、代码实现 1、根据Shp计算Bounds 2、生成经纬网要素集合 3、写入 Shapefile 三、结果输出与验证 1、格网文件输出格式 2、GIS工具验证 四、总结 前言 在当今数字化与信息化高速发展的…...
[docker基础二]NameSpace隔离实战
目录 一 实战目的 二 基础知识 1)dd 命令详解 2)mkfs命令详解 3)df命令详解 4)mount 命令详解 5)unshare命令详解 三 实战操作一(PID隔离) 四 实战操作二(MOunt隔离) 1)创建 Mount 隔离进程 2)在新进程里边,创建空白文件&#…...
PIC18F45K80 ECAN模块使用
PIC18F45K80的CAN使用过程遇到一些问题,记录一下,主要是代码的理解。 在MPLAB X中配置工程: 1,在MCC中添加ECAN外设 2,CAN通讯有波特率的概念,整一个CAN网络需要运行在同一个速率。这里我们把他配置到12…...
RuntimeError: expected scalar type ComplexDouble but found Float
要解决 RuntimeError: expected scalar type ComplexDouble but found Float 错误,请按照以下步骤操作: 步骤 1:定位错误发生的位置 查看完整的错误堆栈跟踪,确定具体是哪一行代码引发了错误。例如:RuntimeError: exp…...
基于DeepSeek的韦恩图绘制:方法、优化与应用
一、研究背景与冲突 在生物信息学、医学研究、数据科学等众多领域,清晰展示数据集之间的交集关系至关重要。韦恩图(Venn diagram)作为一种有效的可视化工具,能以直观的图形呈现多个数据集之间的重叠情况,帮助研究者快…...
自动驾驶的“眼睛”:用Python构建智能障碍物检测系统
自动驾驶的“眼睛”:用Python构建智能障碍物检测系统 在自动驾驶技术日益成熟的今天,障碍物检测系统成了汽车智能化不可或缺的部分。无论是高速公路上的突发状况,还是城市街道中的行人与车辆,准确识别障碍物并及时反应,是保证行车安全的关键。 那么,我们如何用Python构…...
基于HTML+JavaScript+CSS实现教学网站
摘要 21世纪是信息化的时代,信息化物品不断地涌入我们的生活。同时,教育行业也产生了重大变革。传统的身心教授的模式,正在被替代。互联网模式的教育开辟了一片新的热土。 这算是对教育行业的一次重大挑战。截至目前,众多教育行…...
【Pandas】pandas DataFrame all
Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 True pandas.DataFrame.all() pandas.DataFrame.all() 方…...
何时需要import css文件?怎么知道需要导入哪些css文件?为什么webpack不提示CSS导入?(导入css导入规则、css导入规范)
文章目录 何时需要import css文件?**1. 使用模块化工具(如 Webpack、Vite、Rollup 等)****适用场景:****示例:****优点:** **2. 动态加载 CSS(按需加载)****适用场景:***…...
智汇云舟亮相第二十七届北京科博会
5月8日,备受瞩目的第二十七届中国北京国际科技产业博览会(以下简称:北京科博会)在国家会议中心盛大开幕。作为我国科技领域的重要盛会,北京科博会汇聚了众多前沿科技成果与创新力量,为全球科技产业交流搭建…...
ThreadLocal
9.1.1 面试题 ThreadLocal中ThreadLocalMap的数据结构和关系ThreadLocal的key是弱引用,这是为什么?ThreadLocal内存泄漏问题你知道吗?ThreadLocal中最后为什么要加remove方法?...
【高并发内存池】从零到一的项目之centralcache整体结构设计及核心实现
个人主页 : zxctscl 专栏 【C】、 【C语言】、 【Linux】、 【数据结构】、 【算法】 如有转载请先通知 文章目录 前言1. central cache整体结构2. central cache基础结构2.1 span类设计2.2 SpanList带头双向循环链表设计2.3 central cache类设计 3. central cache核…...
(pnpm)引入 其他依赖失败,例如‘@element-plus/icons-vue‘失败
当我们在开发项目的时候,利用了 pnpm 来进行管理,可能有些依赖就无法引入,这是因为 pnpm 和 npm 管理包的方式不一样, 举个例子,假如我们现在需要安装一个 A 包,A 包依赖 B 包, 此时我们通过 …...
面试题:请解释Java中的线程池(ThreadPoolExecutor)的工作原理,并说明如何自定义线程池
线程池(ThreadPoolExecutor)的工作原理 线程池是一种用于管理和复用线程的机制,它可以减少线程创建和销毁的开销,提高程序的执行效率。ThreadPoolExecutor是Java中实现线程池的一个类,它位于java.util.concurrent 包中…...
Windows Server 2025开启GPU分区(GPU-P)部署DoraCloud云桌面
本文描述在ShareStation工作站虚拟化方案的部署过程。 将服务器上部署 Windows Server、DoraCloud,并创建带有vGPU的虚拟桌面。 GPU分区技术介绍 GPU-P(GPU Partitioning) 是微软在 Windows 虚拟化平台(如 Hyper-V)中…...
WEB前端表单及表格标签综合案例
表单标签综合案例: 源代码: <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…...
HTML应用指南:利用POST请求获取全国德邦快递服务网点位置信息
德邦快递作为中国领先的综合性物流服务提供商,自1996年成立以来,始终致力于为客户提供高效、安全的大件快递及其他物流解决方案。德邦快递凭借其强大的直营模式、“最后一公里”的优质服务以及对科技的持续投入,在竞争激烈的物流市场中占据了重要位置。特别是在大件快递领域…...
【Linux网络】应用层自定义协议与序列化
应用层自定义协议与序列化 应用层 我们程序员写的一个个解决我们实际问题,满足我们日常需求的网络程序,都是在应用层. 协议是一种"约定".Socket的接口,在读写数据时,都是按"字符串"的方式来发送接收的.如果我们要传输一些"结构化的数据"怎么办…...
Excel提取单元格特定符号左右两边内容
公式: RIGHT(字符串, 字符个数) :从字符串右边开始,提取指定字数内容 公式应用: RIGHT(A1, LEN(A1) - SEARCH(“-”, A1))—提取单元格A1中符号“-”右边的字符串 LEN(A1) - SEARCH(“-”, A1) 即是返回符号“-”右边的字符串长…...
集群/微服务/分布式
目录 介绍 集群 微服务 优点 缺点 如何管理和监控微服务架构中的多个微服务? 服务治理 配置管理 监控与告警 容器化与编排 安全管理 分布式 三者关系 分布式和集群的区别是什么? 概念 工作方式 节点角色 应用场景 故障处理 微服务 微…...
安装docker
安装docker 一、关闭防火墙和SELinux 1.1systemctl stop firewalld 1.2setenfoce 0 二、配置内核转发以及网桥过滤 2.1vi /etc/sysctl.d/k8s.conf 2.2sysctl -p /etc/sysctl.d/k8s.conf :让文件生效 2.3modprobe br_netfilter:加载模块 若未生效成功…...
热力图是什么?三分钟学会热力图数据分析怎么做!
目录 一、热力图是什么? (一)基本概念 (二)常见类型 (三)优点 二、热力图分析工具 (一)FineBI (二)Tableau (三)P…...
Spring、SpringMVC、SpringBoot、SpringCloud 联系与区别
Spring、SpringMVC、SpringBoot、SpringCloud 联系与区别 一、引言 在 Java 企业级开发中,Spring 家族框架是绕不开的核心技术栈。从基础架构到 Web 开发,再到微服务架构,Spring 系列框架通过层层抽象,逐步简化开发复杂度。本文…...
操作系统导论——第26章 并发:介绍
本章介绍为单个运行进程提供的新抽象:线程(thread)。经典观点是一个程序只有一个执行点(一个程序计数器,用来存放要执行的指令),但多线程(multi-threaded)程序会有多个执…...
如何使用测试软件 Jmeter
第一步,点击 编辑 添加线程组 第二步,右键单击线程组,添加取样器 HTTP 请求 第三步,设置请求路径 第四步,添加 查看结果树 用于查看请求响应 最后点击绿色小三角启动即可...
HarmonyOS NEXT 免费无广告看电影app:从想法到实现的经验总结
学习一项新技能,最好也是最快的方法就是动手实战。学习鸿蒙也一样,给自己定一个小目标,直接找项目练,这样进步是最快的。最近,我在网上看到360周董的一句话:“想干什么就去干,干得烂总比不干强!…...
《算法导论(第4版)》阅读笔记:p14-p16
《算法导论(第4版)》学习第 9 天,p14-p16 总结,总计 3 页。 一、技术总结 无。 二、英语总结(生词:2) 1. in light of (1)释义 idiom. in light of 是美式用法,英式用法是 in the light of。take sth into consideration(鉴…...
kuka, fanuc, abb机器人和移动相机的标定
基础知识 : 一, 9点标定之固定相机标定: 图1: 固定位置相机拍照 因为相机和机器人的基坐标系是固定的, 所以在海康威视相机的9点标定功能栏中, 填上海康使用“圆查找”捕捉到的坐标值, 再将机器人显示的工具坐标系在基坐标系的实时位置pos_act值填入物理坐标X, Y中即可 图2:…...
【MyBatis-6】MyBatis动态SQL:灵活构建高效数据库查询的艺术
在现代企业级应用开发中,与数据库的交互是不可或缺的核心部分。MyBatis作为一款优秀的持久层框架,因其简洁、灵活和高效而广受开发者喜爱。其中,动态SQL功能更是MyBatis的一大亮点,它允许开发者根据不同条件灵活构建SQL语句&#…...
从零开始理解FlashAttention:算法细节图解
🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…...
js原型污染 + xss劫持base -- no-code b01lersctf 2025
题目信息:Found this new web framework the other day—you don’t need to write any code, just JSON. 我们先来搞清楚究竟发生了什么 当我们访问 /index /*** 处理 /:page 路径的 GET 请求* param {Object} req - 请求对象* param {Object} reply - 响应对象* returns {Pro…...
面试题:Java集合框架高频面试题总结
# Java集合框架高频面试题总结 ## 集合框架概述 1. **Java集合框架的主要组成部分** - Collection接口 - List: 有序可重复 - Set: 无序不可重复 - Queue: 队列 - Map接口: 键值对存储 2. **集合框架的继承体系** - Collection - List → Arra…...
【大模型ChatGPT+ArcGIS】数据处理、空间分析、可视化及多案例综合应用
在数字化和智能化的浪潮中,GIS(地理信息系统)和GPT(生成式预训练模型)的结合正日益成为推动科研、城市规划、环境监测等领域发展的关键技术。GIS以其强大的空间数据处理、先进的空间分析工具、灵活的地图制作与可视化能…...
使用JMETER中的JSON提取器实现接口关联
一、JSON提取器介绍 JSON提取器是JMETER工具中用于从JSON响应中提取数据的重要组件,常常用于接口关联场景中(参数传递)。 二、添加JSON提取器 举例(积分支付接口请求数据依赖于创建订单接口响应的payOrderId) 1.在…...
Filecoin存储管理:如何停止Lotus向特定存储路径写入新扇区数据
Filecoin存储管理:如何停止Lotus向特定存储路径写入新扇区数据 引言背景问题场景解决方案步骤1:修改sectorstore.json文件步骤2:重新加载存储配置步骤3:验证更改 技术原理替代方案最佳实践结论 引言 在Filecoin挖矿过程中&#x…...
Elasticsearch太重?它的超轻量的替代品找到了!
简要介绍 在海量数据时代,快速而精准地找到所需信息至关重要。如果您正为此苦恼,或者您是 Elasticsearch 的用户,并对其资源消耗或性能有所关注,那么今天我要向您介绍一款名为 Manticore Search 的开源搜索数据库,它或…...