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能解決, 最後我就真的能解決, 不管用多久, 這個問題我要解決, 那這是遇到了問題了, 如果沒有遇到那麼多問題怎麼辦, 有句話不是說沒有機會就創造機會, 不斷的去實踐, 不斷的去解決問題, 不要讓自己長時間閒著, 人一旦閒著,就廢了。通過實踐得到的成就會讓你更興奮和開心。