java中的字节流

问题描述 投票:0回答:2

我们可以用字节流在文件中写入 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字符。那么,为什么它在这种情况下有效呢?

java file-io unicode character-encoding fileoutputstream
2个回答
3
投票

我读到字节流不支持 unicode 字符。

要么您使用了错误的信息来源,要么您可能误解了某些内容。字节流支持字节。因此,字节流支持可以用字节表示的“任何东西”。视频、文字、图片、音乐……如果字节流不支持,根本无法在数字计算机中使用。 用简单的 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 规则转换为字节。


0
投票
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.