完美的解決方法從辟謠開始:
1)JDOM是否生成UTF-8的文件與Format是否設置無關,只有輸出其他字符編碼才需要設置,見下面的注釋。
2)JDOM輸出UTF-8文件亂碼的根本原因并非在JDOMAPI,而是在JDK。
具體描述:
JDOM的輸出類XMLOutputter有兩個output接口,除了都具有一個Document參數外,分別接受Writer和 OutputStream參數。
這給我們一個錯覺,兩個接口可以任意使用。
首先我們用output(doc,System.out)來做測試,此時得到亂碼,
然后我們改為output(doc,new PrintWriter(System.out))來測試,輸出不是亂碼,
也就是說在控制臺的時候一定要用一個Writer接口包裝一下。
然后我們用output(doc,new FileWriter(path))來做測試,結果卻得到亂碼,
然后我們改為output(doc,new FileOutputStream(path))來測試,輸出不是亂碼,
也就是說在輸出文件的時候一定要用一個OutputStream接口包裝一下。
瘋了吧?呵呵,很搞笑是吧。經過到JDOM的源碼中調試,發現沒有任何問題,問題出在了JDK里面。
JDK內的對應接口處理:
1)PrintWriter類有參數為OutputStream的構造方法,因此可以從System.out包裝到PrintWriter
2)FileWriter類沒有參數為OutputStream的構造方法,因此不能從FileOutputStream包裝到 FileWriter
3)如果PrintWriter類用了參數為Writer的構造方法(Writer實現為FileWriter),最后輸出也是亂碼
4)如果用一個FileOutputStream來包裝一個控制臺輸出,也是亂碼
因此,對于JDK內的各種輸出體系,各種InputStream、OutputStream、reader和writer要充分認識,否則極容易出現一些意想不到的問題。