3

以前は、xstreamを介してUTF-8エンコーディングでXMLを読み取るために、次のようにDomDriverを使用しています。

XStream xStream = new XStream(new DomDriver("UTF-8"));

しかし、後で私はこれが非常に遅いことに気付きます。私は次の方法を使用します:

xstreamの読み込み速度を最適化する

これは少なくとも正常に機能します。

しかし、後で、同じ手法をXMLの記述に適用できないことに気付きました。私はすべてを取得します??? 文字。

これは、書き込み中にDomDriverを使用して実行可能な最後のコードです

public static boolean toXML(Object object, File file) {
    XStream xStream = new XStream(new DomDriver("UTF-8"));
    OutputStream outputStream = null;

    try {
        outputStream = new FileOutputStream(file);
        xStream.toXML(object, outputStream);
    }
    catch (Exception exp) {
        log.error(null, exp);
        return false;
    }
    finally {
        if (false == close(outputStream)) {
            return false;
        }
        outputStream = null;
    }

    return true;
}

上記のコードは正常に機能します。DomDriverを使用しないreadメソッドと一致させるために、コードを次のように変更します。

public static boolean toXML(Object object, File file) {
    XStream xStream = new XStream();
    OutputStream outputStream = null;
    Writer writer = null;

    try {
        outputStream = new FileOutputStream(file);
        writer = new OutputStreamWriter(outputStream, Charset.forName("UTF-8"));
        xStream.toXML(object, outputStream);
    }
    catch (Exception exp) {
        log.error(null, exp);
        return false;
    }
    finally {
        if (false == close(writer)) {
            return false;
        }
        if (false == close(outputStream)) {
            return false;
        }
        writer = null;
        outputStream = null;
    }

    return true;
}

今回は、漢字がすべて???に変わります。

間違ったことを教えてもらえますか?

4

1 に答える 1

12

このコードを見てください:

outputStream = new FileOutputStream(file);
writer = new OutputStreamWriter(outputStream, Charset.forName("UTF-8"));
xStream.toXML(object, outputStream);

UTF-8を使用するライターを作成していますが、それを完全に無視しています。

代わりにこれを試してください:

xStream.toXML(object, writer);

また、スタイルの問題として、次のことを検討することをお勧めします。

  • 結果をブール定数と比較しないでください。使用するif (foo)か、if (!foo)代わりに
  • キャッチすることExceptionめったに良い考えではありません。代わりに特定の例外をキャッチする
  • 成功または失敗を示すブール値を返すことは、慣用的なJavaではありません。通常、何かが失敗した場合は、例外の方が適しています
  • 最初の呼び出しcloseが失敗した場合は、2番目の呼び出しの前にメソッドを終了していますがclose、これはおそらくあなたが望むものではありません。(実際、OutputStreamWriter`を閉じると、とにかくストリームが閉じますが、その原理を考慮してください。)
  • nullメソッドの最後にローカル変数を設定する必要はなく、コードが煩雑になります
于 2010-09-04T15:54:41.660 に答える