java中的字节流

时间:2012-12-14 05:57:33

标签: 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字符。那么,为什么它会在这种情况下起作用呢?

2 个答案:

答案 0 :(得分: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 characters”而陷入陷阱,你的文件是用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规则将文本转换为字节。

答案 1 :(得分:1)

通常最好通过将OutputStream包含OutputStreamWriter包装到Writer中来编写字符数据

Writer out = new OutputStreamWriter(new FileOutputStream("file path"), "UTF-8"));