Java xstream处理非英语字符

Java xstream处理非英语字符,java,Java,我有以下代码: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package helloworld; import com.thoughtworks.xstream.XStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStrea

我有以下代码:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package helloworld;

import com.thoughtworks.xstream.XStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import javax.swing.JOptionPane;

/**
 *
 * @author yccheok
 */
public class Test {
    @SuppressWarnings("unchecked")
    public static <A> A fromXML(Class c, File file) {
        XStream xStream = new XStream();
        InputStream inputStream = null;

        try {
            inputStream = new java.io.FileInputStream(file);
            Object object = xStream.fromXML(inputStream);
            if (c.isInstance(object)) {
                return (A)object;
            }
        }
        catch (Exception exp) {
            exp.printStackTrace();
        }
        finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                    inputStream = null;
                }
                catch (java.io.IOException exp) {
                    exp.printStackTrace();
                    return null;
                }
            }
        }

        return null;
    }

    @SuppressWarnings("unchecked")
    public static <A> A fromXML(Class c, String filePath) {
        return (A)fromXML(c, new File(filePath));
    }

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

        try {
            outputStream = new FileOutputStream(file);
            xStream.toXML(object, outputStream);
        }
        catch (Exception exp) {
            exp.printStackTrace();
            return false;
        }
        finally {
            if (outputStream != null) {
                try {
                    outputStream.close();
                    outputStream = null;
                }
                catch (java.io.IOException exp) {
                    exp.printStackTrace();
                    return false;
                }
            }
        }

        return true;
    }

    public static boolean toXML(Object object, String filePath) {
        return toXML(object, new File(filePath));
    }

    public static void main(String args[]) {
        String s = "\u6210\u4EA4\u91CF";
        // print ???
        System.out.println(s);
        // fine! show 成交量
        JOptionPane.showMessageDialog(null, s);
        toXML(s, "C:\\A.XML");
        String o = fromXML(String.class, "C:\\A.XML");
        // show ???
        JOptionPane.showMessageDialog(null, o);
    }
}
/*
*要更改此模板,请选择工具|模板
*然后在编辑器中打开模板。
*/
包helloworld;
导入com.thoughtworks.xstream.xstream;
导入java.io.File;
导入java.io.FileOutputStream;
导入java.io.InputStream;
导入java.io.OutputStream;
导入javax.swing.JOptionPane;
/**
*
*@作者yccheok
*/
公开课考试{
@抑制警告(“未选中”)
公共静态A fromXML(c类,文件){
XStream XStream=新的XStream();
InputStream InputStream=null;
试一试{
inputStream=new java.io.FileInputStream(文件);
Object Object=xStream.fromXML(inputStream);
if(c.isInstance(object)){
返回(A)对象;
}
}
捕获(异常扩展){
exp.printStackTrace();
}
最后{
如果(inputStream!=null){
试一试{
inputStream.close();
inputStream=null;
}
捕获(java.io.IOException exp){
exp.printStackTrace();
返回null;
}
}
}
返回null;
}
@抑制警告(“未选中”)
公共静态A fromXML(c类,字符串文件路径){
返回(A)fromXML(c,新文件(filePath));
}
公共静态布尔toXML(对象、文件){
XStream XStream=新的XStream();
OutputStream OutputStream=null;
试一试{
outputStream=新文件outputStream(文件);
toXML(对象,outputStream);
}
捕获(异常扩展){
exp.printStackTrace();
返回false;
}
最后{
if(outputStream!=null){
试一试{
outputStream.close();
outputStream=null;
}
捕获(java.io.IOException exp){
exp.printStackTrace();
返回false;
}
}
}
返回true;
}
公共静态布尔toXML(对象对象,字符串文件路径){
返回toXML(对象,新文件(filePath));
}
公共静态void main(字符串参数[]){
字符串s=“\u6210\u4EA4\u91CF”;
//打印???
系统输出打印项次;
//很好!表演成交量
showMessageDialog(null,s);
toXML(s,“C:\\A.XML”);
字符串o=fromXML(String.class,“C:\\A.XML”);
//秀???
showMessageDialog(null,o);
}
}
我在WindowsVista中通过命令提示符运行以下代码

1) 我可以知道为什么System.out.println无法在控制台中打印汉字吗

2) 我打开xstream文件。保存的值为

<string>???</string>
???
如何使xstream正确保存汉字


谢谢。

如果平台上的默认字符编码不能显示中文,您需要在控制台和启动Java时覆盖它。要设置Java的字符编码,请在命令行上设置
file.encoding
属性(如果在程序中调用
System.setProperty()
,则该属性无效)

我不知道在Vista中设置控制台编码的命令。在Windows XP中,它是
chcp
(“更改代码页”)命令。

根据,它生成输出(1)使用您的平台默认编码,以及(2)不使用XML序言。这是一个非常糟糕的组合

常见问题解答建议使用
toXml(Writer)
。如果使用
OutputStreamWriter
,则可以在构造期间指定编码。由于XStream不发出序言,我建议使用“UTF-8”,因为这是XML规范所要求的


或者,我认为您可以按照FAQ中的其他建议之一,使用默认编码手动将XML序言写入流中。我不建议这样做。

为什么我不应该使用“UTF-16”编码?Java字符串不是在UTF-16中存储数据吗?您可以使用UTF-16。对于中文文本,UTF-16文件应该比UTF-8文件小。但是,如果您这样做,则需要在文件的开头发出BOM表,我不相信
OutputStreamWriter
会自动发出BOM表。有关编码的更多信息,请参阅。
XStream xStream = new XStream(new DomDriver("UTF-8")); 
XStream xStream = new XStream(new DomDriver("UTF-8"));