使用工具 IntelliJ IDEA Community Edition 2023.1.4
使用语言 Java8
代码能力快速提升小方法,看完代码自己敲一遍,十分有用
目录
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) ;
}