Java中的字符是1字节还是2字节?

use*_*275 8 java string unicode ascii character

我认为java中的字符是16位,如java doc中所建议的那样.字符串不是这样吗?我有一个代码将对象存储到文件中:

public static void storeNormalObj(File outFile, Object obj) {
    FileOutputStream fos = null;
    ObjectOutputStream oos = null;
    try {
        fos = new FileOutputStream(outFile);
        oos = new ObjectOutputStream(fos);
        oos.writeObject(obj);
        oos.flush();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            oos.close();
            try {
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,我试图将一个字符串存储"abcd"到文件中"output",当我output用编辑器打开并删除无字符串部分时,剩下的只是字符串"abcd",总共是4个字节.谁知道为什么?对于ASCII支持的字符串,java是否使用ASCII而不是UNICODE自动节省空间?谢谢

sjr*_*sjr 7

(我认为"无字符串部分"是指ObjectOutputStream在创建时发出的字节.您可能不想使用ObjectOutputStream,但我不知道您的要求.)

仅供参考,Unicode和UTF-8不是一回事.Unicode是一种标准,除其他外,指定可用的字符.UTF-8是一种字符编码,用于指定这些字符在1和0中的物理编码方式.UTF-8可以使用1个字节表示ASCII(<= 127),最多4个字节表示其他Unicode字符.

UTF-8是ASCII的严格超集.因此,即使您为文件指定UTF-8编码并向其写入"abcd",它也只包含这四个字节:它们在ASCII中具有与UTF-8中相同的物理编码.

您的方法使用的ObjectOutputStream实际编码与ASCII或UTF-8的编码明显不同!如果仔细阅读Javadoc,if obj是一个字符串并且已经在流中发生,则后续调用writeObject将导致对前一个字符串的引用被发出,这可能导致在重复字符串的情况下写入更少的字节.

如果你认真理解这一点,你真的应该花大量时间阅读有关Unicode和字符编码系统的知识.维基百科有一篇关于Unicode的优秀文章作为开端.