xstream - правильный способ сохранить XML в UTF-8 - PullRequest
3 голосов
/ 04 сентября 2010

Ранее, чтобы читать XML в кодировке UTF-8 через xstream, я использую 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;
}

Приведенный выше код работает нормально.Чтобы соответствовать методу read , который не использует DomDriver, я изменяю код на

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;
}

На этот раз все мои китайские иероглифы изменяются на ???

Могу ли я знать, что я сделал неправильно?

1 Ответ

11 голосов
/ 04 сентября 2010

Посмотрите на этот код:

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 завершается неудачно, вы выходите из метода перед вторым вызовом close, что, вероятно, не то, что вам нужно. (На самом деле, закрытие OutputStreamWriter` все равно закроет поток, но примите во внимание принцип.)
  • Установка локальных переменных на null в конце метода не нужна и загромождает ваш код
...