当前位置: 首页 > news >正文

以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为例,实现一个简单的命令行图书管理系统,包括添加图书、删除图书、查找图书等功能。

江河湖海中的代码之旅&#xff1a;打造你的命令行图书管理系统 一、系统简介 1. Java简介 Java&#xff0c;这个编程语言界的“瑞士军刀”&#xff0c;自1995年诞生以来就以其跨平台的特性和强大的生态系统征服了无数开发者的心。想象一下&#xff0c;Java就像是一条蜿蜒曲折…...

[JavaWeb]微头条项目

完整笔记和项目代码&#xff1a; https://pan.baidu.com/s/1PZBO0mfpwDPic4Ezsk8orA?pwdwwp5 提取码: wwp5 JavaWeb-微头条项目开发 1 项目简介 1.1 业务介绍 微头条新闻发布和浏览平台,主要包含业务如下 用户功能 注册功能登录功能 头条新闻 新闻的分页浏览通过标题关键字搜…...

Linux(CentOS)安装达梦数据库 dm8

CentOS版本&#xff1a;CentOS 7&#xff0c;查看操作系统版本信息&#xff0c;请查阅 查看Linux内核版本信息 达梦数据库版本&#xff1a;dm8 一、获取 dm8 安装文件 1、下载安装文件 打开达梦官网&#xff1a;https://www.dameng.com/ 下载的文件 解压后的文件 2、上传安…...

【专题】中国企业出海洞察报告暨解码全球制胜之道报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p38314 在当今全球化的浪潮中&#xff0c;中国企业的出海行动正以前所未有的规模和速度展开&#xff0c;成为全球经济舞台上的重要力量。本报告旨在对 2024 年中国企业出海情况进行深度洞察&#xff0c;涵盖多个领域和视角。 从对外投…...

[ 跨域问题 ] 前后端以及服务端 解决跨域的各种方法

这篇文章主要介绍了跨域问题&#xff0c;包括其定义、产生原因及各种解决方法。原因是浏览器安全策略限制&#xff0c;方法有 JSONP、CORS、Domain、 postMessage、Nginx配置、.NetCore配置。 前言 什么是跨域问题? 在Web应用中&#xff0c;当一个网页的脚本试图去请求另一个域…...

网络安全之信息收集-实战-2

请注意&#xff0c;本文仅供合法和授权的渗透测试使用&#xff0c;任何未经授权的活动都是违法的。 目录 7、网络空间引擎搜索 8、github源码泄露 9、端口信息 10、框架指纹识别 11、WAF识别 12、后台查找 7、网络空间引擎搜索 FOFA&#xff1a;https://fofa.info/ 360 …...

利用飞书多维表格自动发布版本

文章目录 背景尝试1&#xff0c;轮询尝试2&#xff0c;长连接 背景 博主所在的部门比较奇特&#xff0c;每个车型每周都需要发版&#xff0c;所以实际上一周会发布好几个版本。经过之前使用流水线自动发版改造之后&#xff0c;发版的成本已经大大降低了&#xff0c;具体参考&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.新建一个文件&#xff0c;背景为白色&#xff0c;将图片素材放入文件中 2.利用CtrlJ 复制两个图层出来&#xff0c;选择第一个拷贝图层&#xff0c;选择滤镜---杂色---蒙尘与划痕 3.调整一下数值&#xff0c;大概能够模糊痘印痘坑&#xff0c;点击确定。 4.然后选择拷贝2图层…...

如何用Excel批量提取文件夹内所有文件名?两种简单方法推荐

在日常办公中&#xff0c;我们有时需要将文件夹中的所有文件名整理在Excel表格中&#xff0c;方便管理和查阅。手动复制文件名既费时又易出错&#xff0c;因此本文将介绍两种利用Excel自动提取文件夹中所有文件名的方法&#xff0c;帮助你快速整理文件信息。 方法一&#xff1…...

YOLOv8改进,YOLOv8通过RFAConv卷积创新空间注意力和标准卷积,包括RFCAConv, RFCBAMConv,二次创新C2f结构,助力涨点

摘要 空间注意力已广泛应用于提升卷积神经网络(CNN)的性能,但它存在一定的局限性。作者提出了一个新的视角,认为空间注意力机制本质上解决了卷积核参数共享的问题。然而,空间注意力生成的注意力图信息对于大尺寸卷积核来说是不足够的。因此,提出了一种新型的注意力机制—…...

【实验11】卷积神经网络(2)-基于LeNet实现手写体数字识别

&#x1f449;&#x1f3fc;目录&#x1f448;&#x1f3fc; &#x1f352;1. 数据 1.1 准备数据 1.2 数据预处理 &#x1f352;2. 模型构建 2.1 模型测试 2.2 测试网络运算速度 2.3 输出模型参数量 2.4 输出模型计算量 &#x1f352;3. 模型训练 &#x1f352;4.模…...

chatgpt训练需要什么样的gpu硬件

训练像ChatGPT这样的大型语言模型对GPU硬件提出了极高的要求&#xff0c;因为这类模型的训练过程涉及大量的计算和数据处理。以下是训练ChatGPT所需的GPU硬件的关键要素&#xff1a; ### 1. **高性能计算能力** - **Tensor Cores**: 现代深度学习训练依赖于Tensor Cores&#…...

Kubernetes常用命令

Kubernetes常用命令 一、集群管理 kubectl cluster-info&#xff1a;显示集群信息&#xff0c;包括控制平面地址和服务的 URL。 kubectl get nodes&#xff1a;查看集群中的节点列表&#xff0c;包括节点状态、IP 地址等信息。 kubectl describe node <node-name>&…...

Flutter:key的作用原理(LocalKey ,GlobalKey)

第一段代码实现的内容&#xff1a;创建了3个块&#xff0c;随机3个颜色&#xff0c;每次点击按钮时&#xff0c;把第一个块删除 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启动项目报错解决办法

在启动此项目报错&#xff1a; 类似于&#xff1a; django.core.exceptions.ImproperlyConfigured: Requested setting EMOJI_IMG_TAG, but settings are not c启动方式选择django方式启动&#xff0c;以普通python方式启动会报错 2. 这句话提供了对遇到的错误的一个重要线索…...

详细描述一下Elasticsearch搜索的过程?

大家好&#xff0c;我是锋哥。今天分享关于【详细描述一下Elasticsearch搜索的过程&#xff1f;】面试题。希望对大家有帮助&#xff1b; 详细描述一下Elasticsearch搜索的过程&#xff1f; Elasticsearch 的搜索过程是其核心功能之一&#xff0c;允许用户对存储在 Elasticsea…...

Spring、SpringMVC、SpringBoot、Mybatis小结

Spring Spring是一个轻量级的控制反转&#xff08;IoC&#xff09;和面向切面&#xff08;AOP&#xff09;的容器&#xff08;框架&#xff09; Spring框架的核心特性包括依赖注入&#xff08;Dependency Injection &#xff0c;DI&#xff09;、面向切面编程&#xff08;Aspe…...

.NET 9 运行时中的新增功能

本文介绍了适用于 .NET 9 的 .NET 运行时中的新功能和性能改进。 文章目录 一、支持修剪的功能开关的属性模型二、UnsafeAccessorAttribute 支持泛型参数三、垃圾回收四、控制流实施技术.NET 安装搜索行为性能改进循环优化感应变量加宽Arm64 上的索引后寻址强度降低循环计数器可…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...