是 Java 中的 1 字节或 2 字节字符



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

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

基本上,我尝试将字符串"abcd"存储在文件"output"中,当我使用编辑器打开output并删除 none 字符串部分时,剩下的只是字符串"abcd",总共是 4 个字节。有人知道为什么吗?Java 是否通过使用 ASCII 而不是 UNICODE 来自动节省空间,用于 ASCII 可以支持的字符串?谢谢

(我认为"无字符串部分"是指创建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,如果obj是一个字符串并且已经在流中发生,则对 writeObject 的后续调用将导致发出对前一个字符串的引用,这可能会导致在重复字符串的情况下写入的字节更少。

如果你真的想理解这一点,你真的应该花很多时间阅读Unicode和字符编码系统。维基百科有一篇关于Unicode的优秀文章作为开始。

是的,char只是Java运行时环境中的Unicode。如果您希望使用 16 位编码编写它,请使用 FileWriter

    FileWriter outputStream = null;
    try {
        outputStream = new FileWriter("myfilename.dat");
        int c;
        while ((c = inputStream.read()) != -1) {
            outputStream.write(c);
        }
    } finally {
        if (outputStream != null) {
            outputStream.close();
        }
    }

如果你查看 String 的源代码,它会注意到它调用 DataOutput.writeUTF 来写入字符串。如果你读到它,你会发现它们被写成"修改后的UTF-8"。细节很长,但如果你不使用非 7 位 ascii,是的,它将需要一个字节。如果你想要血腥的细节,请查看DataOutput.writeUTF()中的极长javadoc

您可能

有兴趣了解 Java Update 21 性能发行版及更高版本中有一个-XX:+UseCompressedStrings选项。这将允许字符串对不需要char[]的字符串使用byte[]

尽管 Java 热点虚拟机选项指南建议它可能默认处于打开状态,但这可能仅适用于性能版本。 只有当我明确打开它时,它似乎只对我有用。

那么你期待一个16*4=64 bits = 8 bytes文件吗?超过 UTF-8 或 ASCII 编码。将文件写入文件后。内存(就空间而言)管理取决于操作系统。而且你的代码没有控件。

相关内容

  • 没有找到相关文章

最新更新