問題:最近在學習如何給網站添加點擊量和同時在線人數.在不利用數據庫存儲點擊量的前提下,長期保存一個數據(包括服務器關閉時)使用原生的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 不要以爲自己走了許多彎路,離成功還很遙遠,說不定這纔是抵達成功真正的捷徑.