Java进阶总结案例(小说阅读器)

使用工具 IntelliJ IDEA Community Edition 2023.1.4

使用语言 Java8 

代码能力快速提升小方法,看完代码自己敲一遍,十分有用 

目录

1.案例需要实现模块

1.1 项目架构 

2.实现代码 

2.1 工具类

2.1.1 常量类

 2.1.2 用户工具类

2.1.3 小说工具类

2.1.4 其他功能类 

2.1.5 日志框架 

2.2 用户功能

 2.2.1 创建用户类

2.2.2 创建用户功能类

 2.2.3 创建注册功能类

 2.2.4 创建登录功能类

 2.2.5 创建用户选择功能类 

2.3 小说功能 

2.3.1 创建小说类

2.3.2 创建小说类别类 

 2.3.3 创建小说功能类

2.3.4 创建言情小说功能类 

 2.3.5 创建武侠小说功能类

 2.3.6 创建选择小说功能类

 2.4 运行类

 2.4.1 运行类代码


1.案例需要实现模块

功能模块:登录,注册,小说类型列表,小说列表,上传小说,阅读小说,这是一个阅读器小工具。

1.1 项目架构 

  • config:存放系统运行数据(用户信息、小说类型信息、小说列表信息)
  • novels:存放上传的txt小说
  • client:存放启动类程序(只放main()方法启动类)
  • common:存放公共类
  • constants:存放静态常量类
  • util:存放工具类(IO流放进去)
  • entity:存放存储数据所需的实体类(平时创建的对象类,比如用户类)
  • service:存放与功能服务相关的类(接口类、抽象类、实现类)
  • lib:存放架包
  • dao:接口抽象类都放这个

 添加数据到config目录下

  • users.dat:存储用户信息
  • novels.dat:存储小说集合信息

添加Log4j2日志需要的架包
log4j-api-2.23.0.jar与log4j-core-2.23.0.jar(任意版本皆可)

 最终架构结果

2.实现代码 

2.1 工具类

2.1.1 常量类

package cn.ksb.minitxt.common.constants;

/**
 * 阅读器中的常量属性
 */
public class ReaderCon {
    /**
     * 阅读器的头
     */
    public static final String HEAD = "欢迎使用书虫阅读器";
    /**
     * 阅读器的分割线
     */
    public static final String SEPARATE = "--------------------";
    /**
     * 登录选项
     */
    public static final String LOGIN = "1.登录";
    /**
     * 注册选项
     */
    public static final String REGISTER = "2.注册";
    /**
     * 退出选项
     */
    public static final String EXIT = "3.退出";
    /**
     * 选择功能
     */
    public static final String SELECT = "请选择:";
    /**
     * 谢谢使用
     */
    public static final String EXITRESULT = "谢谢使用!";
    /**
     * 输入异常
     */
    public static final String INPUTEX = "您的输入有误!";
    /**
     * 其他异常
     */
    public static final String EX = "未知异常!";
    /**
     * IO流异常
     */
    public static final String IOEX = "发生流异常,请重试!";
    /**
     * 用户序列化路径属性
     */
    public static final String URL = "./config/users.dat";
    /**
     * 书本序列化路径属性
     */
    public static final String NOVELURL="./config/novels.dat";
    /**
     * 言情选择
     */
    public static final String ROMANTICNOVEL="1.言情";
    /**
     * 武侠选择
     */
    public static final String WUXIANOVEL="2.武侠";
    /**
     * 言情小说的头
     */
    public static final String RomHEAD="------------言情小说列表开始------------";
    /**
     * 武侠言情小说的底
     */
    public static final String NOVELBOTTOM="--------------小说列表结束--------------";
    /**
     * 武侠小说的头
     */
    public static final String WUXIAHEAD="------------武侠小说列表开始------------";
    /**
     * 武侠名
     */
    public static final String WUXIANAME="武侠";
    /**
     * 言情名
     */
    public static final String ROMNAME="言情";

}

 2.1.2 用户工具类

package cn.ksb.minitxt.common.util;

import cn.ksb.minitxt.common.constants.ReaderCon;

import java.io.*;

/**
 * 用户文件工具类
 */
public class UserFileUtil {
    /**
     * 用户序列化方法
     *
     * @param obj 用户序列化的内容
     * @throws IOException 用户序列化可能发生的异常
     */
    public void writerObject(Object obj) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream(ReaderCon.URL);//使用文件输出流获取路径
        ObjectOutputStream out = new ObjectOutputStream(fileOutputStream);//使用对象输出流序列化
        out.writeObject(obj);//输出数据
        out.flush();//把缓冲区的数据也刷出去,不然登录时无法找到
    }

    /**
     * 用户反序列化方法
     *
     * @return 反序列化的对象
     * @throws IOException 用户反序列化可能发生的异常
     */
    public Object readerObject() throws IOException {
        FileInputStream fileInputStream = new FileInputStream(ReaderCon.URL);//使用文件输入流获取路径
        return new ObjectInputStream(fileInputStream);//返回对象输入流对象
    }
}

2.1.3 小说工具类

package cn.ksb.minitxt.common.util;

import cn.ksb.minitxt.common.constants.ReaderCon;
import cn.ksb.minitxt.dao.NovelDao;
import cn.ksb.minitxt.entity.Novel;
import cn.ksb.minitxt.service.WuXiaService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.*;
import java.util.ArrayList;

/**
 * 书本文件工具类
 */
public class NovelFileUtil {
    /**
     * 日志属性
     */
    protected static Logger logger = LogManager.getLogger(NovelDao.class);

    /**
     * 书本序列化方法
     *
     * @param obj 用户序列化的内容
     * @throws IOException 用户序列化可能发生的异常
     */
    public static void writerObject(Object obj) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream(ReaderCon.NOVELURL);//使用文件输出流获取路径
        ObjectOutputStream out = new ObjectOutputStream(fileOutputStream);//使用对象输出流序列化
        out.writeObject(obj);//输出数据
        out.flush();//把缓冲区的数据也刷出去,不然查找时无法找到
    }

    /**
     * 书本反序列化方法
     *
     * @return 反序列化的对象
     * @throws IOException 用户反序列化可能发生的异常
     */
    public static Object readerObject() throws IOException {
        FileInputStream fileInputStream = new FileInputStream(ReaderCon.NOVELURL);//使用文件输入流获取路径
        return new ObjectInputStream(fileInputStream);//返回对象输入流对象
    }

    /**
     * 获取书籍内容方法
     *
     * @param src 书籍路径
     * @return 返回字符输入流对象
     */
    public static Object reader(String src) {
        BufferedReader input = null;
        try {
            Reader reader1 = new FileReader(src);//创建字符输入流对象
            input = new BufferedReader(reader1);//新建buffered输入流对象
        } catch (FileNotFoundException e) {
            System.out.println(ReaderCon.IOEX);
            logger.error(NovelFileUtil.class.getName() + "类发生了" + e.getMessage() + "异常!");
        }
        return input;
    }
}

2.1.4 其他功能类 

package cn.ksb.minitxt.dao;

import cn.ksb.minitxt.client.Run;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.util.Scanner;

/**
 * 其他功能类
 */
public abstract class BaseDao {
    /**
     * 输入属性
     */
    public Scanner input = new Scanner(System.in);

    /**
     * 展示功能方法
     */
    protected abstract void printFunction();
}

2.1.5 日志框架 

<?xml version="1.0" encoding="UTF-8" ?>
<configuration status="OFF">
    <appenders>
        <!--输出日志到控制台的配置-->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%m%n%l"/>
        </Console>
        <!--输出日志到文件的配置-->
        <File name="log" fileName="logs/oop.log">
            <PatternLayout pattern="%d [%t] %-5p [%c]-%m%n"/>
        </File>
    </appenders>
    <loggers>
        <root level="ALL">
            <appender-ref ref="Console"/>
            <appender-ref ref="log"/>
        </root>
    </loggers>
</configuration>

2.2 用户功能

 2.2.1 创建用户类

package cn.ksb.minitxt.entity;

import java.io.Serializable;
import java.util.HashMap;

/**
 * 用户类
 */
public class User implements Serializable {
    private static final long serialVersionUID = 3L;
    /**
     * 用户账号密码集合属性
     */
    public HashMap<String, String> map = new HashMap<>();

}

2.2.2 创建用户功能类

package cn.ksb.minitxt.dao;

import cn.ksb.minitxt.entity.Novel;
import cn.ksb.minitxt.entity.User;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * 用户功能类
 */
public abstract class UserDao {
    /**
     * 输入属性
     */
    public Scanner input = new Scanner(System.in);
    /**
     * 日志属性
     */
    protected static Logger logger = LogManager.getLogger(UserDao.class);

    /**
     * 添加用户和登录用户息方法
     *
     * @param user 用户对象,让登录和注册共用一个对象
     * @param list 书本对象
     */
    protected abstract void loginAndReg(User user, ArrayList<Novel> list) ;
}
Java小说阅读器的设计和代码较为复杂,需要涉及到图形界面、文件读取和解析、数据存储等多个方面。下面是一个简单的示例,供参考: 设计: 1. 主界面:包括小说列表、搜索框、分、收藏等功能。 2. 阅读界面:显示小说内容、目录、翻页等功能。 3. 设置界面:包括字体、字号、背景颜色等设置。 代码: 1. 主界面实现: ```java public class MainFrame extends JFrame { private JPanel contentPane; private JTextField searchField; private JComboBox<String> categoryComboBox; private JList<String> novelList; private JButton collectButton; public MainFrame() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 800, 600); setTitle("小说阅读器"); contentPane = new JPanel(); setContentPane(contentPane); contentPane.setLayout(null); searchField = new JTextField(); searchField.setBounds(10, 10, 200, 30); contentPane.add(searchField); categoryComboBox = new JComboBox<String>(); categoryComboBox.setBounds(220, 10, 100, 30); contentPane.add(categoryComboBox); novelList = new JList<String>(); novelList.setBounds(10, 50, 310, 500); contentPane.add(novelList); collectButton = new JButton("收藏"); collectButton.setBounds(330, 10, 80, 30); contentPane.add(collectButton); } } ``` 2. 阅读界面实现: ```java public class ReaderFrame extends JFrame { private JPanel contentPane; private JTextArea contentArea; private JList<String> chapterList; private JButton previousButton; private JButton nextButton; public ReaderFrame() { setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setBounds(100, 100, 800, 600); setTitle("小说阅读器"); contentPane = new JPanel(); setContentPane(contentPane); contentPane.setLayout(null); contentArea = new JTextArea(); contentArea.setBounds(10, 50, 770, 500); contentPane.add(contentArea); chapterList = new JList<String>(); chapterList.setBounds(10, 50, 150, 500); contentPane.add(chapterList); previousButton = new JButton("上一页"); previousButton.setBounds(10, 10, 80, 30); contentPane.add(previousButton); nextButton = new JButton("下一页"); nextButton.setBounds(100, 10, 80, 30); contentPane.add(nextButton); } } ``` 3. 设置界面实现: ```java public class SettingFrame extends JFrame { private JPanel contentPane; private JComboBox<String> fontComboBox; private JComboBox<Integer> fontSizeComboBox; private JComboBox<String> colorComboBox; private JButton confirmButton; private JButton cancelButton; public SettingFrame() { setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setBounds(100, 100, 400, 300); setTitle("设置"); contentPane = new JPanel(); setContentPane(contentPane); contentPane.setLayout(null); fontComboBox = new JComboBox<String>(); fontComboBox.setBounds(10, 10, 100, 30); contentPane.add(fontComboBox); fontSizeComboBox = new JComboBox<Integer>(); fontSizeComboBox.setBounds(120, 10, 60, 30); contentPane.add(fontSizeComboBox); colorComboBox = new JComboBox<String>(); colorComboBox.setBounds(190, 10, 100, 30); contentPane.add(colorComboBox); confirmButton = new JButton("确定"); confirmButton.setBounds(100, 220, 80, 30); contentPane.add(confirmButton); cancelButton = new JButton("取消"); cancelButton.setBounds(200, 220, 80, 30); contentPane.add(cancelButton); } } ``` 以上代码只是一个简单的示例,实现的功能较为简单,需要根据实际需求进行修改和完善。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值