以Java为例,实现一个简单的命令行图书管理系统,包括添加图书、删除图书、查找图书等功能。
江河湖海中的代码之旅:打造你的命令行图书管理系统
一、系统简介
1. Java简介
Java,这个编程语言界的“瑞士军刀”,自1995年诞生以来就以其跨平台的特性和强大的生态系统征服了无数开发者的心。想象一下,Java就像是一条蜿蜒曲折但又充满活力的长江,它从高山出发,穿越平原,最终汇入广阔的大海——也就是我们的计算机世界。无论你是在Windows的森林里探险,还是在macOS的草原上奔跑,甚至是在Linux的沙漠中漫步,只要有JVM(Java虚拟机)作为你的船,你就能畅游无阻。
2. 命令行图书管理系统概述
现在让我们把目光投向一个更加具体的场景:一个基于Java开发的命令行图书管理系统。这不仅仅是一个简单的软件项目,它是你与知识海洋之间架起的一座桥梁。通过这个项目,你可以学会如何利用Java来处理文件I/O操作、用户输入输出以及基本的数据结构等核心概念。想象一下,每当你成功添加一本新书到系统中时,就像是在这片知识的海洋里投下了一颗石子,激起一圈圈涟漪;而当你删除或查找某本书时,则像是在这片波涛汹涌的海面上寻找属于自己的那一片宁静之地。
二、功能实现
1. 添加图书
1.1 输入图书信息
首先,我们需要定义一个Book类来表示书籍对象。这个类应该包含书名、作者、ISBN编号等属性,并提供相应的构造函数和方法来访问这些属性。接下来,我们将编写一段代码来读取用户通过控制台输入的信息,并将其转化为Book实例。
import java.util.Scanner;class Book {private String title;private String author;private String isbn;public Book(String title, String author, String isbn) {this.title = title;this.author = author;this.isbn = isbn;}// Getters and setters omitted for brevity}
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入书名:");String title = scanner.nextLine();System.out.println("请输入作者:");String author = scanner.nextLine();System.out.println("请输入ISBN编号:");String isbn = scanner.nextLine();Book book = new Book(title, author, isbn);// 后续步骤...}}```#### 1.2 将图书信息存储到文件或数据库中一旦我们有了`Book`对象,下一步就是将其保存起来以便日后使用。这里有两种常见的方法:直接写入文本文件或者使用数据库进行管理。为了简单起见,我们这里选择前者。我们可以创建一个名为`books.txt`的文件,并将每本新添加的书籍按照一定格式写入其中。```javaimport java.io.FileWriter;import java.io.IOException;
// ... 前面的代码保持不变 ...try (FileWriter writer = new FileWriter("books.txt", true)) {writer.write(book.getTitle() + "," + book.getAuthor() + "," + book.getIsbn() + "");} catch (IOException e) {e.printStackTrace();}```请注意,上述示例仅展示了最基本的错误处理方式。实际应用中可能需要更复杂的逻辑来确保数据完整性和安全性。
### 2. 删除图书
#### 2.1 根据书名查找图书
要删除一本书之前,首先得找到它。这意味着我们需要遍历整个`books.txt`文件,检查每一行是否匹配给定的书名。如果找到了匹配项,则记录下该行的索引位置以便稍后删除。
```java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;// ... 前面的代码保持不变 ...public static int findBookIndexByTitle(String title) throws IOException {List<String> lines = new ArrayList<>();try (BufferedReader reader = new BufferedReader(new FileReader("books.txt"))) {String line;while ((line = reader.readLine()) != null) {lines.add(line);}}for (int i = 0; i < lines.size(); i++) {if (lines.get(i).startsWith(title)) {return i;}}return -1; // Not found}```#### 2.2 从文件或数据库中删除图书信息一旦我们知道了要删除的书籍所在的位置,接下来就可以执行实际的删除操作了。同样地,这里以文本文件为例说明过程。我们会重新打开`books.txt`,但是这次是以覆盖模式写入除了目标行之外的所有内容。```javaimport java.io.RandomAccessFile;import java.nio.channels.FileChannel;import java.nio.channels.FileLock;
// ... 前面的代码保持不变 ...public static void deleteBook(String title) {int index = findBookIndexByTitle(title);if (index == -1) {System.out.println("未找到指定书籍!");return;}try (RandomAccessFile raf = new RandomAccessFile("books.txt", "rw");FileChannel channel = raf.getChannel();FileLock lock = channel.lock()) {raf.seek(0); // Move to the beginning of the fileStringBuilder sb = new StringBuilder();for (int i = 0; i < lines.size(); i++) {if (i != index) {sb.append(lines.get(i)).append("");}}raf.setLength(0); // Truncate the fileraf.write(sb.toString().getBytes()); // Write back modified content} catch (IOException e) {e.printStackTrace();}}```请注意,上述代码片段使用了`RandomAccessFile`和`FileChannel`来实现对文件的安全访问。这样做可以防止多个进程同时修改同一个文件导致的数据竞争问题。当然,如果你打算部署到生产环境,可能还需要考虑更多因素如事务支持、并发控制等。
### 3. 查找图书
#### 3.1 根据书名在文件或数据库中查找图书
查找功能其实已经在删除部分有所涉及,即通过遍历整个`books.txt`文件来搜索特定书名的书籍。不过,为了让这部分内容更加独立清晰,我们可以将其封装成一个单独的方法。
```java
public static Book findBookByTitle(String title) throws IOException {int index = findBookIndexByTitle(title);if (index == -1) {return null; // Not found} else {String[] parts = lines.get(index).split(",");return new Book(parts[0], parts[1], parts[2]);}}```#### 3.2 输出查找结果最后一步就是向用户展示查找结果啦!根据前面的方法返回的结果,我们可以很容易地打印出相关信息。如果找到了对应的书籍,则显示其详细信息;否则提示用户没有找到匹配项。```javapublic static void displaySearchResult(String title) {try {Book book = findBookByTitle(title);if (book != null) {System.out.println("找到书籍:");System.out.println("书名: " + book.getTitle());System.out.println("作者: " + book.getAuthor());System.out.println("ISBN: " + book.getIsbn());} else {System.out.println("未找到指定书籍!");}} catch (IOException e) {e.printStackTrace();}}```---好了,以上就是关于如何使用Java构建一个简单的命令行图书管理系统的详细介绍。希望通过这篇博客能够激发你对编程的兴趣,并且鼓励你去尝试自己动手实现这样一个有趣的小项目。记住,实践是最好的老师!加油吧,未来的程序员们!💪🌟
相关文章:
以Java为例,实现一个简单的命令行图书管理系统,包括添加图书、删除图书、查找图书等功能。
江河湖海中的代码之旅:打造你的命令行图书管理系统 一、系统简介 1. Java简介 Java,这个编程语言界的“瑞士军刀”,自1995年诞生以来就以其跨平台的特性和强大的生态系统征服了无数开发者的心。想象一下,Java就像是一条蜿蜒曲折…...
[JavaWeb]微头条项目
完整笔记和项目代码: https://pan.baidu.com/s/1PZBO0mfpwDPic4Ezsk8orA?pwdwwp5 提取码: wwp5 JavaWeb-微头条项目开发 1 项目简介 1.1 业务介绍 微头条新闻发布和浏览平台,主要包含业务如下 用户功能 注册功能登录功能 头条新闻 新闻的分页浏览通过标题关键字搜…...
Linux(CentOS)安装达梦数据库 dm8
CentOS版本:CentOS 7,查看操作系统版本信息,请查阅 查看Linux内核版本信息 达梦数据库版本:dm8 一、获取 dm8 安装文件 1、下载安装文件 打开达梦官网:https://www.dameng.com/ 下载的文件 解压后的文件 2、上传安…...
【专题】中国企业出海洞察报告暨解码全球制胜之道报告汇总PDF洞察(附原数据表)
原文链接:https://tecdat.cn/?p38314 在当今全球化的浪潮中,中国企业的出海行动正以前所未有的规模和速度展开,成为全球经济舞台上的重要力量。本报告旨在对 2024 年中国企业出海情况进行深度洞察,涵盖多个领域和视角。 从对外投…...
[ 跨域问题 ] 前后端以及服务端 解决跨域的各种方法
这篇文章主要介绍了跨域问题,包括其定义、产生原因及各种解决方法。原因是浏览器安全策略限制,方法有 JSONP、CORS、Domain、 postMessage、Nginx配置、.NetCore配置。 前言 什么是跨域问题? 在Web应用中,当一个网页的脚本试图去请求另一个域…...
网络安全之信息收集-实战-2
请注意,本文仅供合法和授权的渗透测试使用,任何未经授权的活动都是违法的。 目录 7、网络空间引擎搜索 8、github源码泄露 9、端口信息 10、框架指纹识别 11、WAF识别 12、后台查找 7、网络空间引擎搜索 FOFA:https://fofa.info/ 360 …...
利用飞书多维表格自动发布版本
文章目录 背景尝试1,轮询尝试2,长连接 背景 博主所在的部门比较奇特,每个车型每周都需要发版,所以实际上一周会发布好几个版本。经过之前使用流水线自动发版改造之后,发版的成本已经大大降低了,具体参考&a…...
深入内核讲明白Android Binder【一】
深入内核讲明白Android Binder【一】 前言一、Android Binder应用编写概述二、基于C语言编写Android Binder跨进程通信Demo0. Demo简介1. 服务的管理者server_manager.c2. Binder服务端代码实现 test_service.c2.1 实现思路2.2 完整实现代码 3. Binder客户端代码实现 test_clie…...
Photoshop(PS)——人像磨皮
1.新建一个文件,背景为白色,将图片素材放入文件中 2.利用CtrlJ 复制两个图层出来,选择第一个拷贝图层,选择滤镜---杂色---蒙尘与划痕 3.调整一下数值,大概能够模糊痘印痘坑,点击确定。 4.然后选择拷贝2图层…...
如何用Excel批量提取文件夹内所有文件名?两种简单方法推荐
在日常办公中,我们有时需要将文件夹中的所有文件名整理在Excel表格中,方便管理和查阅。手动复制文件名既费时又易出错,因此本文将介绍两种利用Excel自动提取文件夹中所有文件名的方法,帮助你快速整理文件信息。 方法一࿱…...
YOLOv8改进,YOLOv8通过RFAConv卷积创新空间注意力和标准卷积,包括RFCAConv, RFCBAMConv,二次创新C2f结构,助力涨点
摘要 空间注意力已广泛应用于提升卷积神经网络(CNN)的性能,但它存在一定的局限性。作者提出了一个新的视角,认为空间注意力机制本质上解决了卷积核参数共享的问题。然而,空间注意力生成的注意力图信息对于大尺寸卷积核来说是不足够的。因此,提出了一种新型的注意力机制—…...
【实验11】卷积神经网络(2)-基于LeNet实现手写体数字识别
👉🏼目录👈🏼 🍒1. 数据 1.1 准备数据 1.2 数据预处理 🍒2. 模型构建 2.1 模型测试 2.2 测试网络运算速度 2.3 输出模型参数量 2.4 输出模型计算量 🍒3. 模型训练 🍒4.模…...
chatgpt训练需要什么样的gpu硬件
训练像ChatGPT这样的大型语言模型对GPU硬件提出了极高的要求,因为这类模型的训练过程涉及大量的计算和数据处理。以下是训练ChatGPT所需的GPU硬件的关键要素: ### 1. **高性能计算能力** - **Tensor Cores**: 现代深度学习训练依赖于Tensor Cores&#…...
Kubernetes常用命令
Kubernetes常用命令 一、集群管理 kubectl cluster-info:显示集群信息,包括控制平面地址和服务的 URL。 kubectl get nodes:查看集群中的节点列表,包括节点状态、IP 地址等信息。 kubectl describe node <node-name>&…...
Flutter:key的作用原理(LocalKey ,GlobalKey)
第一段代码实现的内容:创建了3个块,随机3个颜色,每次点击按钮时,把第一个块删除 import dart:math; import package:flutter/material.dart; import package:flutter_one/demo.dart;void main() {runApp(const App()); }class App…...
R语言基础入门详解
文章目录 R语言基础入门详解一、引言二、R语言环境搭建1、安装R和RStudio1.1、步骤1.2、获取工作目录 三、R语言基础2、语法基础2.1、赋值操作2.2、注释 3、数据类型与结构3.1、向量3.2、矩阵 4、基本操作4.1、数据读取4.2、数据可视化 四、R语言使用示例4.1、统计分析示例4.2、…...
django启动项目报错解决办法
在启动此项目报错: 类似于: django.core.exceptions.ImproperlyConfigured: Requested setting EMOJI_IMG_TAG, but settings are not c启动方式选择django方式启动,以普通python方式启动会报错 2. 这句话提供了对遇到的错误的一个重要线索…...
详细描述一下Elasticsearch搜索的过程?
大家好,我是锋哥。今天分享关于【详细描述一下Elasticsearch搜索的过程?】面试题。希望对大家有帮助; 详细描述一下Elasticsearch搜索的过程? Elasticsearch 的搜索过程是其核心功能之一,允许用户对存储在 Elasticsea…...
Spring、SpringMVC、SpringBoot、Mybatis小结
Spring Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架) Spring框架的核心特性包括依赖注入(Dependency Injection ,DI)、面向切面编程(Aspe…...
.NET 9 运行时中的新增功能
本文介绍了适用于 .NET 9 的 .NET 运行时中的新功能和性能改进。 文章目录 一、支持修剪的功能开关的属性模型二、UnsafeAccessorAttribute 支持泛型参数三、垃圾回收四、控制流实施技术.NET 安装搜索行为性能改进循环优化感应变量加宽Arm64 上的索引后寻址强度降低循环计数器可…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
