JavaWeb中的IO流路径问题

问题:最近在学习如何给网站添加点击量和同时在线人数.在不利用数据库存储点击量的前提下,长期保存一个数据(包括服务器关闭时)使用原生的IO流是很简便的.

在这里插入图片描述

想法很简单,在实现IO流的iListener类同路径下创建一个txt文本来保存点击量.所以当时代的代码就这么写了.

String s = "";
BufferedReader br = null;
        try {//读取主页的点击率
            br = new BufferedReader(new FileReader("clickNum.txt"));
            s = br.readLine();
            System.out.println("读取到的数据-->"+s);
            int i = Integer.parseInt(s);
            sce.getServletContext().setAttribute("clickNum",i);
        } catch (Exception e) {
            e.printStackTrace();
        }

看起来没什么毛病,相对路径下直接写文件名就可以调用
但是int i = Integer.parseInt(s);这一行一直报错,使用readLine()取得是null…

由于想自己搞明白,没在网上搜,我一直以为是字符集的问题,但搞了半天还是回到了utf-8.

又觉得跟多线程有关.以为在readline还没执行完的时候就直接调用s的值了.但后来想想不可能,因为这样设计简直是反人类.


百度了一下后,发现是路径问题,在项目发布后本来的相对地址失效了,直接写文件名其实是在根目录下查找,所以一直取null

改进了代码后,这个问题就解决了

String s = "";
        BufferedReader br = null;
        try {//读取主页的点击率
            String filePath = sce.getServletContext().getRealPath("/WEB-INF/classes/Listener/clickNum.txt");
            br = new BufferedReader(new FileReader(filePath));//读取classes文件夹下的文件
            s = br.readLine();
            System.out.println("读取到的数据-->"+s);
            int i = Integer.parseInt(s);
            sce.getServletContext().setAttribute("clickNum",i);
        } catch (Exception e) {
            e.printStackTrace();
        }

通过这个过程我发现我还是太年轻,一直觉得是个小问题很快就能解决,但是我错了.
感悟如下
1 平常的学习中,会遗漏很多的细节,同样的代码换个环境就很可能会出bug.不要总以为是对的就是对的.
2 学习不能过于钻牛角尖,要有目的性,比如我浪费了一两个小时来找bug,不如直接用一两分钟找度娘.有时候自己写的bug可能是别人根本不会犯的低级错误.
3 不能一口吃个大胖子,很多新知识都应该取认真的剖析,踏踏实实地学习.
4 不要以为自己走了许多弯路,离成功还很遥远,说不定这才是抵达成功真正的捷径.

发布了15 篇原创文章 · 获赞 9 · 访问量 689

猜你喜欢

转载自blog.csdn.net/weixin_43544077/article/details/103089120
今日推荐