java 实现小说管理系统

需求:实现下面功能

欢迎进入小说管理系统
请选择菜单
1.上传小说
2.查看所有小说
3.删除小说
4.下载小说
5.阅读小说

阅读小说时要实现分页功能,每页显示100个字符且有以下选项

1.首页 2.上一页 3.下一页 4.尾页 5.退出阅读

提示:

创建一个小说类(小说编号,小说名,作者,上传后的路径);用一个list来存储当前的小说数量;固定一个用户目录用来存储用户上传的小说;阅读功能可以用一个变量来标记当前页;

思路:

  1. 上传小说,就把用户指定的路径下的文件通过流复制到我们事先设定好的一个文件夹中
  1. 查看所有小说时,直接遍历list即可
  2. 通过遍历查找对应id的小说对象,然后从list中删除该对象,最后把该对象中存储的小说路径下的小说删除
  3. 下载小说可以从小说对象的路径中复制到用户指定目录
  4. 阅读分页需要知道小说字符个数,然后/100来编号,最后使用skip()函数来达到目的
  5. 给list存档,每次选择系统功能前都先要反序列化出来list;每次执行完上传,删除功能后都应该序列化list;

入口函数:Main函数

public class Main {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        while(true){
            System.out.println("欢迎进入小说管理系统");
            System.out.println("请选择菜单");
            System.out.println("1.上传小说");
            System.out.println("2.查看所有小说");
            System.out.println("3.删除小说");
            System.out.println("4.下载小说");
            System.out.println("5.阅读小说");
            
            //1.反序列化
            JQNovelTool.deserialize();
            String input = new Scanner(System.in).nextLine();
            if (!input.matches("\\d")){
                System.out.println("请输入对应选项");
                continue;
            }
            int sel = Integer.parseInt(input);
            switch(sel){
            case 1:{
                if(JQNovelTool.upload()){
                    System.out.println("上传成功");
                    //序列化
                    JQNovelTool.serialize();
                }
                else
                    System.out.println("上传失败");
            }
                break;
                
            case 2:{
                System.out.println("已上传的小说");
                JQNovelTool.showNovels();
            }
                break;
                
            case 3:{
                System.out.println("请输入您要删除的小说编号");
                if (JQNovelTool.remove()){
                    System.out.println("删除成功");
                    //序列化
                    JQNovelTool.serialize();
                }else{
                    System.out.println("没有对应小说编号");
                }
            }
                break;
            case 4:{
                System.out.println("请输入您要下载的小说编号");
                if(JQNovelTool.download())
                    System.out.println("下载成功");
                else
                    System.out.println("没有对应小说编号或目录");
            }
                break;
            case 5:{
                System.out.println("请输入您要阅读的小说编号");
                if (!JQNovelTool.read())
                    System.out.println("没有对应小说编号");
            }
                break;
            default:
                System.out.println("暂时没有对应的功能,敬请期待");
                break;
            }
        }

    }

}

工具类:JQNovelTool

public class JQNovelTool {

    private static String savePath = "D:/novels";
    private static String serializePath = "D:/novels/serialize";
    private static List <Novel> novelsList = new ArrayList<Novel>();
    
    static {
        File file = new File(savePath);
        if (!file.exists()){
            file.mkdirs();
        }
        file = new File(serializePath);
        if (!file.exists()){
            try {
                file.createNewFile();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    /**
     * 上传小说*/
    public static boolean upload() throws IOException{
        String novelName;
        String novelAuthor;
        String uploadPath;
        System.out.println("请输入上传小说名:");
        novelName = new Scanner(System.in).nextLine();
        
        System.out.println("请输入上传小说作者:");
        novelAuthor = new Scanner(System.in).nextLine();
        
        System.out.println("请输入上传小说路径:");
        uploadPath = new Scanner(System.in).nextLine();
        
        Novel novel = new Novel(novelsList.size(),novelName,novelAuthor);
        if(uploadFile(novel,uploadPath)){   
            novelsList.add(novel);
            return true;
        }
        return false;
    }
    
    /**
     * 显示所有小说信息*/
    public static void showNovels(){
        getAllNovels();
    }
    
    /**
     * 删除小说*/
    public static boolean remove(){
        //1.显示当前小说列表
        getAllNovels();
        //2.获取用户输入编号
        int sel = new Scanner(System.in).nextInt();
        if (sel<0 || sel>=novelsList.size())
            return false;
        //3.查找对应编号小说
        Novel novel = getNovel(sel);
        //4.删除小说
        new File(novel.getUploadPath()).delete();
        return novelsList.remove(novel);
    }
    
    /**
     * 下载小说到用户指定路径*/
    public static boolean download() throws IOException{
        //1.显示当前小说列表
        getAllNovels();
        //2.获取用户输入编号
        int sel = new Scanner(System.in).nextInt();
        //3.判断是不中存在该文件
        Novel novel = getNovel(sel);
        if (novel == null)
            return false;
        //2.获取用户输入的目标路径
        System.out.println("请输入目标路径");
        String path = new Scanner(System.in).nextLine();
        return downloadFile(novel,path);
    }
    
    /**
     * 读取小说*/
    public static boolean read() throws IOException{
        //1.显示当前小说列表
        getAllNovels();
        //2.获取用户输入编号
        String input = new Scanner(System.in).nextLine();
        if (!input.matches("\\d")){
            return false;
        }
        int sel = Integer.parseInt(input);
        Novel novel = getNovel(sel);
        if (novel == null)
            return false;
        read(novel);
        return true;
    }
    
    /**
     * 提供序列化*/
    public static void serialize () throws IOException{
        File file = new File(serializePath);
        FileOutputStream outStream = new FileOutputStream(file);
        ObjectOutputStream objOutStream = new ObjectOutputStream(outStream);
        objOutStream.writeObject(novelsList);
        objOutStream.close();
    }
    
    /**
     * 与反序列化*/
    public static void deserialize () throws IOException, ClassNotFoundException{
        File file = new File(serializePath);
        if (file.length()<=0)
            return;
        FileInputStream inStream = new FileInputStream(serializePath);
        ObjectInputStream objInStream = new ObjectInputStream(inStream);
        try{
            @SuppressWarnings (value={"unchecked"})
            List<Novel> object = (ArrayList<Novel>) objInStream.readObject();
            novelsList =  object;
        }catch(Exception e){
            e.printStackTrace();
        }
        objInStream.close();
    }
    
    /**
     * 从指定路径上传文件到数据库*/
    private static boolean uploadFile(Novel novel,String oriPath) throws IOException{
        //1.判断目标路径是否存在
        File oriFile = new File(oriPath);
        if(!oriFile.exists()){
            return false;
        }
        //2.创建管道流
        File tarFile = new File(savePath+File.separator+novel.getName()+".txt");
        BufferedReader reader = new BufferedReader(new FileReader(oriFile));
        BufferedWriter writer = new BufferedWriter(new FileWriter(tarFile));
        //3.创建文件
        String line = "";
        while((line = reader.readLine())!=null){
            writer.write(line);
        }
        //4.给novel设置最终存储路径
        novel.setUploadPath(tarFile.getAbsolutePath());
        //5.关闭管道
        reader.close();
        writer.close();
        return true;
    }
    
    /**
     * 删除文件*/
    private static boolean deleteFile(String path){
        File file = new File(path);
        if (file.exists()){
            file.delete();
            return true;
        }
        return false;
    }
    
    /**
     * 下载小说文件*/
    private static boolean downloadFile(Novel novel,String desPath) throws IOException{
        //1.判断目标文件是否存在且不是文件
        File desfile = new File(desPath);
        if (!desfile.exists() || desfile.isFile()){
            return false;
        }
        //2.得到数据库中小说且创建管道
        File oriFile = new File(novel.getUploadPath());
        BufferedReader reader = new BufferedReader(new FileReader(oriFile));
        //3.设置目标位置且创建管道
        BufferedWriter writer = new BufferedWriter(new FileWriter(desfile+File.separator+novel.getName()+".txt"));
        String line = "";
        while((line = reader.readLine())!=null){
            writer.write(line);
        }
        //4.关闭通道
        reader.close();
        writer.close();
        return true;
    }
    
    /**
     * 通过索取获取list中的novel对象,没有则返回null*/
    private static Novel getNovel(int index){
        Iterator <Novel> it = novelsList.iterator();
        while(it.hasNext()){
            Novel novel = it.next();
            if (novel.getId() == index){
                return novel;
            }
        };
        return null;
    }
    
    /**
     * 分页读取小说内容*/
    private static void read(Novel novel) throws IOException{
        int curRow = 0;//当前阅读所在的页数
        int count = getCharCount(novel);//获取所有字符个数
        int rowCount = 0;//可以分为多少页
        if (count%100 == 0){
            rowCount = count/100;
        }else{
            rowCount = count/100+1;
        }
        
        //传入指定页码,获取对应的100个字符
        System.out.println(getReadStr(novel,curRow));
        
        //阅读选项 
        while (true){
            System.out.println("1.首页   2.上一页   3.下一页   4.尾页  5.退出阅读");
            String input = new Scanner(System.in).nextLine();
            if (!input.matches("\\d")){
                System.out.println("请输入对应选项");
                continue;
            }
            int sel = Integer.parseInt(input);
            switch(sel){
            case 1:
                curRow = 0;
                break;
            case 2:
                curRow -= 1;
                if (curRow<0){  //不能让其越界
                    curRow = 0;
                    System.out.println("已到首页");
                }
                    
                break;      
            case 3:
                curRow += 1;
                if (curRow>=rowCount){ //不能让其越界
                    curRow = rowCount-1;
                    System.out.println("已到尾页");
                }
                break;
            case 4:
                curRow = rowCount-1;
                break;
            case 5:
                return;
            default:
                System.out.println("没有该项操作");
            }
            
            System.out.println(getReadStr(novel,curRow));
        }
    }
    
    /**
     * 根据小说的路径,获取文件的字符个数(字符可以是英文,也可以是中文)*/
    private static int getCharCount(Novel novel) throws IOException{
        File oriFile = new File(novel.getUploadPath());
        FileReader fileReader = new FileReader(oriFile);
        int currentLine = 0;
        int count =0;
        //通过便历文件内容的方式来获取字符个数,虽然感觉很傻B,但是目前也没有什么好办法
        while(fileReader.read()!=-1){   
            count++;
        }
        fileReader.close();
        return count;
    }
    
    /**
     * 读取给定小说的页码内容*/
    private static String getReadStr(Novel novel,int curRow) throws IOException{
        //1.取出小说对应的绝对路径
        File oriFile = new File(novel.getUploadPath());
        FileReader fileReader = new FileReader(oriFile);
        fileReader.skip(curRow * 100);  //关键部分,使用skip函数
        //2.每次读取100个字符
        char buf[] = new char[100];
        fileReader.read(buf);
        fileReader.close();
        //3.返回buf
        return new String(buf);
    }
    /*如果最后的内容不够100个字符也不会有问题,该read(buf)只是尽力的去填满这100的容量,不够就把剩余的内容装进去就好*/
    
    /**
     * 获取list中所有小说*/
    private static void getAllNovels(){
        System.out.println("小说编号\t小说名称\t小说作者");
        Iterator <Novel> it = novelsList.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}

小说类:Novel

public class Novel implements Serializable{
    
    private static final long serialVersionUID = 1L;
    
    private int id;
    private String name;
    private String author;
    private String uploadPath;
    
    public Novel (int id,String name,String author){
        this.id= id;
        this.name = name;
        this.author= author;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getAuthor() {
        return author;
    }

    public String getUploadPath() {
        return uploadPath;
    }

    public void setUploadPath(String uploadPath) {
        this.uploadPath = uploadPath;
    }
    
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return this.getId()+"\t"+this.getName()+"\t"+this.getAuthor();
    }
}
Paste_Image.png
Paste_Image.png
Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,368评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • 感恩大恩上师及诸佛菩萨的慈悲加持与护佑; 感恩历代宗亲及父母的养育之恩; 感恩格西老师,张慧老师带领我学习金刚智慧...
    希热拉嘎阅读 253评论 0 2
  • 感赏儿子对他爷爷的感情深。他爷爷不是亲爷爷,就是儿子从两岁到六岁的时候在他家生活。前两天在他爷爷家住,他爷爷给了他...
    付静_9204阅读 173评论 0 6