以Java为例,实现一个简单的命令行图书管理系统,包括添加图书、删除图书、查找图书等功能。

embedded/2024/11/20 10:55:29/

江河湖海中的代码之旅:打造你的命令行图书管理系统

一、系统简介

1. Java简介

Java,这个编程语言界的“瑞士军刀”,自1995年诞生以来就以其跨平台的特性和强大的生态系统征服了无数开发者的心。想象一下,Java就像是一条蜿蜒曲折但又充满活力的长江,它从高山出发,穿越平原,最终汇入广阔的大海——也就是我们的计算机世界。无论你是在Windows的森林里探险,还是在macOS的草原上奔跑,甚至是在Linux的沙漠中漫步,只要有JVM(Java虚拟机)作为你的船,你就能畅游无阻。

2. 命令行图书管理系统概述

现在让我们把目光投向一个更加具体的场景:一个基于Java开发的命令行图书管理系统。这不仅仅是一个简单的软件项目,它是你与知识海洋之间架起的一座桥梁。通过这个项目,你可以学会如何利用Java来处理文件I/O操作、用户输入输出以及基本的数据结构等核心概念。想象一下,每当你成功添加一本新书到系统中时,就像是在这片知识的海洋里投下了一颗石子,激起一圈圈涟漪;而当你删除或查找某本书时,则像是在这片波涛汹涌的海面上寻找属于自己的那一片宁静之地。


二、功能实现

1. 添加图书

1.1 输入图书信息

首先,我们需要定义一个Book类来表示书籍对象。这个类应该包含书名、作者、ISBN编号等属性,并提供相应的构造函数和方法来访问这些属性。接下来,我们将编写一段代码来读取用户通过控制台输入的信息,并将其转化为Book实例。

java">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构建一个简单的命令行图书管理系统的详细介绍。希望通过这篇博客能够激发你对编程的兴趣,并且鼓励你去尝试自己动手实现这样一个有趣的小项目。记住,实践是最好的老师!加油吧,未来的程序员们!💪🌟

http://www.ppmy.cn/embedded/139052.html

相关文章

移远通信5G RedCap模组RG255C-CN通过中国电信5G Inside终端生态认证

近日&#xff0c;移远通信5G RedCap模组RG255C-CN荣获中国电信颁发的5G Inside终端生态认证证书。这表明&#xff0c;该产品在5G基本性能、网络兼容性、安全特性等方面已经过严格评测且表现优异&#xff0c;将进一步加速推动5G行业终端规模化应用。 中国电信5G Inside终端生态认…

【Cesium】自定义材质,添加带有方向的滚动路线

【Cesium】自定义材质&#xff0c;添加带有方向的滚动路线 &#x1f356; 前言&#x1f3b6;一、实现过程✨二、代码展示&#x1f3c0;三、运行结果&#x1f3c6;四、知识点提示 &#x1f356; 前言 【Cesium】自定义材质&#xff0c;添加带有方向的滚动路线 &#x1f3b6;一、…

计算机毕业设计 | SpringBoot+vue汽车资讯网站 汽车购买咨询管理系统(附源码+论文)

1&#xff0c;绪论 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理汽车资讯网站的相关信息成为必然…

Unity 编辑器下 Android 平台 Addressable 加载模型粉红色,类似材质丢失

Unity 编辑器下 Android 平台 Addressable 加载模型粉红色&#xff0c;类似材质丢失 Addressable Play Mode Script加载模式 选择 Use Existiing Build 1.Unity 切换到 PC 平台&#xff0c;执行 Addressable Build 运行&#xff0c;加载 bundle 内的预制体 显示正常 2.Unit…

Redis 性能优化 18招

前言 Redis在我们的日常开发工作中&#xff0c;使用频率非常高&#xff0c;已经变成了必不可少的技术之一。 Redis的使用场景也很多。 比如&#xff1a;保存用户登录态&#xff0c;做限流&#xff0c;做分布式锁&#xff0c;做缓存提升数据访问速度等等。 那么问题来了&…

go-zero(六) JWT鉴权

go-zero JWT鉴权 还记得我们之前登录功能&#xff0c;返回的信息是token吗&#xff1f; 这个token其实就是JSON Web Token简称JWT,它是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在网络应用环境间安全地传递声明信息。 它是一种基于 JSON 的令牌&#xf…

Python模块、迭代器、正则表达式

一、Python模块 在我们编程的时候&#xff0c;先创建一个 .py 文件&#xff0c;这个文件就称之为 一个模块 Module。 使用模块的优点&#xff1a; 模块化编程&#xff0c;多文件编程 1.模块的使用 import语句 想要B.py文件中&#xff0c;使用A.py文件&#xff0c;只需要在…

Flink是如何实现 End-To-End Exactly-once的?

flink 如何实现端到端的 Exactly-once? 端到端包含 Source, Transformation,Sink 三部分的Exactly-once Source&#xff1a;支持数据的replay&#xff0c;如Kafka的offset。Transformation&#xff1a;借助于checkpointSink&#xff1a;Checkpoint 两阶段事务提交 两阶段提…