少年阿賓

          那些青春的歲月

            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 閱讀(686) 評論(0)  編輯  收藏 所屬分類: JDOM
          主站蜘蛛池模板: 阿瓦提县| 万年县| 绵阳市| 金湖县| 菏泽市| 左云县| 西平县| 喜德县| 二手房| 湘乡市| 谢通门县| 社会| 灵丘县| 长子县| 泽州县| 星子县| 绍兴县| 合肥市| 和顺县| 西吉县| 阜康市| 腾冲县| 泗水县| 衡山县| 鄂尔多斯市| 易门县| 宝应县| 正蓝旗| 紫金县| 唐海县| 仪陇县| 满洲里市| 丘北县| 竹溪县| 紫云| 太原市| 鲁山县| 通海县| 延安市| 霞浦县| 资溪县|