1. 程式人生 > >Android FileOutputStream FileInputStream 讀寫問題記錄

Android FileOutputStream FileInputStream 讀寫問題記錄

問題描述

在使用 FileOutputStream 和 FileInputStream 進行檔案讀寫時發現大概率出現把檔案清空的情況,非常費解!

檔案的讀取和寫入程式碼大體如下:

try {
         input = new FileInputStream(dataFile);
         byte[] buffer = new byte[MOVE_BUFFER_LENGTH];
         int length;
         StringBuilder builder = new StringBuilder();
         while ((length = input.read(buffer)) != -1) {
             builder.append(new String(buffer, 0, length));
         }
         
         output = new FileOutputStream(dataFile);
         output.write("String".getBytes());
     } catch (Exception e) {
         e.getMessage();
     } finally {
         close(input);
         close(output);
     }

在這一段短短的程式碼中我一直沒有認為有什麼需要注意的地方,直到遇到了上面的問題, 注意: output = new FileOutputStream(dataFile); 這一段程式碼執行之後檔案就已經被清空了, 即使你沒有執行寫入程式碼, 如果想不清空檔案而在檔案內容末尾寫入可以加引數:output = new FileOutputStream(dataFile, true);

我遇到的問題是寫入也執行了但是沒有寫入進去, 所以我確定是寫入出了問題,原因就是我寫入的字串有中文, 讀取的時候出現了亂碼, 所以我在讀取和寫入的時候都加入編碼從而解決了這個問題:

while ((length = input.read(buffer)) != -1) {
  	 builder.append(new String(buffer, 0, length, "GB18030"));
}

output.write(array.toString().getBytes("GB18030"));

解決這樣一個問題竟然歷時2天時間,話說一個人在職場中的能力就是解決問題的能力, 有的時候不是你技術瞭解的多問題就能解決的, 我發現分析方法也是非常的關鍵,比如我遇到這個問題, 我要寫入的字串差不多是這樣的:[{"f" , "hehe???"}], 寫入之後實際的檔案內容是: [], 這說明內容還是有寫入, 只是沒有寫入完全, 所以是寫入的內容出了問題, 如果我一開始就從這個點去深入分析可能不會用到辣麼長的時間。

在這期間小夥伴也勸我把這段方法註釋掉算了, 期間我也猶豫過是否要這樣做, 當我想這樣做的時候我總覺得很彆扭,這樣做的方式不是很妥當,並沒有從根本上解決問題, 其實類似這樣的事件在我從畢業工作到現在遇到過很多, 剛開始我也是敷衍的解決bug,有問題的程式碼就註釋掉, 容易出問題的地方為了專案不延期就catch住, 現在我覺得走了很多彎路, 人和人之間的巨大差別就是這樣產生的, 從平時一點一滴的解決問題裡面,我覺得我工作這幾年技術上肯定是有提升的,但是我更喜歡這種做事方法和分析能力的提升,我相信這個bug能解決, 最後我就真的能解決, 不管用多久, 這個問題我要解決, 那這是遇到了問題了, 如果沒有遇到那麼多問題怎麼辦, 有句話不是說沒有機會就創造機會, 不斷的去實踐, 不斷的去解決問題, 不要讓自己長時間閒著, 人一旦閒著,就廢了。通過實踐得到的成就會讓你更興奮和開心。