java - java中的字节流

标签 java file-io unicode character-encoding fileoutputstream

我们可以使用 ByteStreams 在文件中写入 Unicode 数据吗? 我的代码是:

 public static void main(String[] args) throws Exception {

    String str = "Русский язык ";
    FileOutputStream fos = new FileOutputStream("file path");
    fos.write(str.getBytes());
    fos.flush();
    fos.close();
}

我在这里使用字节流来写入 unicode 数据,但它写入正确。我是 java 的新手,但我读到字节流不支持 unicode 字符。那么,为什么它在这种情况下有效?

最佳答案

i have read that byte streams do not support unicode characters.

要么您使用了错误的信息来源,要么您可能误解了某些内容。字节流支持字节。因此字节流支持可以用字节表示的任何。视频、文字、图片、音乐……如果字节流不支持,根本无法在数字计算机中使用。

用 1 和 0 的简单序列来表示这些东西的诀窍是使用商定的规则。您可以根据特定规则对您的文本进行编码,然后接收方可以使用相同的规则将其解码回来。

"Русский язык" 可以在任何支持西里尔字符的编码中表示为字节。在unicode的任何一种编码中:UTF-8、UTF-16、UTF-32; Windows-1251、KOI8-R、KOI8-U、ISO-8859-5……

这并不意味着这些编码相互兼容。在编码西里尔文字时,它们都是不兼容的,因此以一种编码编码的文本必须严格以该编码解码。

.getBytes() 使用平台默认编码,恰好是支持西里尔文字的编码。您可能认为它是 UTF-8,但如果您使用的是 Windows,则更有可能是 Cp1251。不要陷入陷阱,因为你使用了“unicode 字符”,你的文件在物理上是用 UTF 编码编码的。这将导致编码问题。

因此,请始终明确编码,以便您的程序在任何平台上都能正常工作,并且您始终知道您的程序创建的文件采用何种编码。使用您的代码,您可以这样做:

String str = "Русский язык ";
FileOutputStream fos = new FileOutputStream("file path");
fos.write(str.getBytes("UTF-8"));
fos.flush();
fos.close();

或者按照其他答案的建议:

String str = "Русский язык ";
OutputStreamWriter osw = new OutputStreamWriter(
        new FileOutputStream("file path"), "UTF-8"
);
osw.write(str);
osw.flush();
osw.close();

这些在技术上完全相同;正根据 UTF-8 规则将文本转换为字节。

关于java - java中的字节流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13873463/

相关文章:

java - 选定的 bean 不在同一个模块或企业应用程序中

java - ADT 树 - 是节点的祖先/后代吗?

java - Struts2 - 在页面上显示验证错误

java - 将数据保存到托管 .dat 文件

c++ - 作为标准输入从文件中读取

java - 如何将大表放入内存中?

Java MySQL使用BasicFileAttributes插入图像文件上次访问时间

Javascript:Unicode 字符串到十六进制

python - 具有适当 unicode 支持的图表

c++ - Windows 上的 std::basic_string<TCHAR> 会优于 std::wstring 吗?