问题:最近在学习如何给网站添加点击量和同时在线人数.在不利用数据库存储点击量的前提下,长期保存一个数据(包括服务器关闭时)使用原生的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 不要以为自己走了许多弯路,离成功还很遥远,说不定这才是抵达成功真正的捷径.