少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
          完美的解決方法從辟謠開始:
          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要充分認識,否則極容易出現一些意想不到的問題。


          posted on 2012-08-15 09:34 abin 閱讀(681) 評論(0)  編輯  收藏 所屬分類: JDOM
          主站蜘蛛池模板: 新邵县| 彭水| 桦南县| 资兴市| 白山市| 郸城县| 凯里市| 泾阳县| 和硕县| 郴州市| 常德市| 白城市| 华亭县| 宁强县| 文登市| 高阳县| 天等县| 惠安县| 康定县| 阳山县| 新竹县| 诸城市| 康保县| 宿迁市| 梁山县| 阳新县| 新津县| 平武县| 拜城县| 灵石县| 抚顺市| 双城市| 广元市| 隆安县| 高州市| 桐庐县| 闻喜县| 罗平县| 即墨市| 枞阳县| 伊吾县|