Re: [問題] 新手請教一個寫入檔案的問題

看板java作者 (小安)時間16年前 (2009/05/30 01:17), 編輯推噓11(1101)
留言12則, 12人參與, 最新討論串2/4 (看更多)
※ 引述《kako0507 (...)》之銘言: : 不好意思請問一下各位 : 我想要覆寫一個文字檔案(不會更動到原本的資料直接加入在最後) : 但是我在很多物件裡面都會更動到這個檔案 所以要new很多次 : 問題來了 每new一次file就完全洗掉之前的資料 : 要怎麼做才可以不動到原本的資料直接加入在最後呢? : PS.我用的是PrintWriter 猶豫了很久不知道該不該回這篇 (ci) 雖然說直接給答案只要兩行就解決, 不過我實在是不喜歡這樣, 所以我只好試試看能不能把它解釋清楚了, 如果有什麼地方沒解釋清楚或誤用, 還請各位多多指教。 --- Java 的 stream 類別很多,讓人目不暇給 FileInputStream, FileOutputStream, FileReader, FileWriter 光是 File 開頭的就有這四種, 其他開頭的還有 Object, Data, Print, Buffered.... 還有兩個 InputStreamReader 和 OutputStreamWriter 這兩個奇怪東西, 到底我該用的是什麼? 它們之間又有什麼差別? 先從 Reader/Writer 和 InputStream/OutputStream 說起好了, Reader 是讀,InputStream 也是讀, 兩著乍看之下都是在做讀資料, 其間差別究竟何在? 根據 API 上的說法,InputStream 是以 byte 為單位, 而 Reader 則是以字元為單位,並且會根據編碼 decode。 OutputStream 與 Writer 的部分當然也是相同。 再來討論這些 streams 的另一個差別, 在前面所提到的所有類別中, 只有 File 開頭類別的沒有 "以其它 Stream 類別為參數" 的 Constructor。 (以下就只以 OutputStream 為例) 這是因為只有 FileOutputStream 是直接在跟 File 溝通, 其他的 Stream 都只是將資料寫入 Constructor 參數中的 OutputStream。 那麼,我們為什麼不只用 FileOutputStream 就好? 你可以去看看 FileOutputStream 提供了哪些 method, 會發現它只提供了有關 byte array 的操作, 如果你想要輸出一行字給這 Stream,你可能會自己處理得很辛苦。 所以啦,Java 提供了一系列好用的 Stream, 把最底層,只提供 byte array 操作的 Stream 包裝起來, 讓你操作起來更直覺, 因此想要寫入字串可以用 PrintStream, 想要把各種基本資料型態, 如 int, double...等的 "值" 輸出,可以用 DataOutputStream。 想要把整個物件 Serialize,則可以用 ObjectOutputStream。 或許你有注意到, PrintWriter 也有提供檔名和 File 物件做為 Constructor 的參數呀! 但這只是為了你使用上的方便, 實際上 PrintWriter 還是會自己宣告一份 FileOutputStream 與檔案溝通。 而 InputStreamReader 和 OutputStreamWriter, 則是用來將 Stream 包裝成 Reader/Writer, 並且由這兩個物件做編碼的處理。 另外,這些包裝是可以多層的, 例如 ObjectOutputStream -> BufferedOutputStream -> FileOutputStream, 或著 PrintWriter -> OutputStreamWriter -> FileOutputStream。 (以上只是舉例) 如果你想要惡搞, 用 ObjectOutputStream 去包裝 DataOutputStream, 甚至是 ObjectOutputStream -> ObjectOutputStream -> ObjectOutputStream -> .... 這樣在宣告與執行上也不會有問題。 (這樣也算是錯誤,不過這是程式邏輯上的錯誤) 講了這麼多,我想我終於可以回答你的問題了! PrintWriter 要如何做出附加檔案的效果? 因為它只是一個包裝住其他 Stream 的...呃...還是 Stream, 它連寫入的東西最後透過網路傳出去,還是寫入檔案都不知道, 最底層的檔案操作根本不關它的事呀! 所以呢,想要設定成檔案寫入附加在後, "請去參考 FileOutputStream 的 API"。 --- 板主,來個妹吧! (呃...我是說來個 m 吧) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.230.13.37 ※ 編輯: tkcn 來自: 61.230.13.37 (05/30 01:19)

05/30 01:24, , 1F
謝謝~~~~
05/30 01:24, 1F

05/30 01:39, , 2F
推 這篇對我的幫助很大
05/30 01:39, 2F

05/30 11:14, , 3F
光 m 沒推文其實...
05/30 11:14, 3F

05/30 11:48, , 4F
推啊~整體觀念有更清楚了
05/30 11:48, 4F

05/30 12:40, , 5F
光有妹沒推...會怎麼樣嗎 @_@
05/30 12:40, 5F

05/30 12:46, , 6F
好清純啊 啊...是好清楚
05/30 12:46, 6F

05/30 14:37, , 7F
關鍵字:要咩
05/30 14:37, 7F

05/30 17:07, , 8F
謝謝大大清楚的解說^^
05/30 17:07, 8F

05/30 21:26, , 9F
05/30 21:26, 9F

06/02 11:01, , 10F
推~
06/02 11:01, 10F

06/03 08:51, , 11F
大大好威!!!
06/03 08:51, 11F

10/14 00:17, , 12F
推!!
10/14 00:17, 12F
文章代碼(AID): #1A81YuwL (java)
討論串 (同標題文章)
文章代碼(AID): #1A81YuwL (java)