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 不要以爲自己走了許多彎路,離成功還很遙遠,說不定這纔是抵達成功真正的捷徑.

發佈了16 篇原創文章 · 獲贊 10 · 訪問量 2470
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章