作者tkcn (小安)
看板java
标题Re: [问题] 新手请教一个写入档案的问题
时间Sat May 30 01:17:43 2009
※ 引述《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)
1F:推 kako0507:谢谢~~~~ 05/30 01:24
2F:推 james732:推 这篇对我的帮助很大 05/30 01:39
3F:推 ogamenewbie:光 m 没推文其实... 05/30 11:14
4F:推 IsMe1086:推啊~整体观念有更清楚了 05/30 11:48
5F:→ tkcn:光有妹没推...会怎麽样吗 @_@ 05/30 12:40
6F:推 h5u:好清纯啊 啊...是好清楚 05/30 12:46
7F:推 TonyQ:关键字:要咩 05/30 14:37
8F:推 csihcs:谢谢大大清楚的解说^^ 05/30 17:07
9F:推 chaostorm:推 05/30 21:26
10F:推 owlman:推~ 06/02 11:01
11F:推 youko:大大好威!!! 06/03 08:51
12F:推 tomap41017:推!! 10/14 00:17