Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的字节流_Java_File Io_Unicode_Character Encoding_Fileoutputstream - Fatal编程技术网

java中的字节流

java中的字节流,java,file-io,unicode,character-encoding,fileoutputstream,Java,File Io,Unicode,Character Encoding,Fileoutputstream,我们可以用ByTestStreams在文件中写入Unicode数据吗? 我的代码是: public static void main(String[] args) throws Exception { String str = "Русский язык "; FileOutputStream fos = new FileOutputStream("file path"); fos.write(str.getBytes()); fos.flush();

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

通常最好通过将OutputStreamWriter与OutputStreamWriter包装到Writer中来写入字符数据

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

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

Writer out = new OutputStreamWriter(new FileOutputStream("file path"), "UTF-8"));
我读到字节流不支持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规则转换为字节

我读到字节流不支持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规则转换为字节。

@Andrew Sure先生,从现在开始,我会注意的。Unicode的内容在
getBytes()
调用中处理,尽管你真的应该像UTF-8一样传递一个显式的字符集。@Louis Wasserman但这里我没有提到UTF-8,但它正在使用以及它是如何工作的,我很烦?@Andrew我会马上在平台上做
string.getBytes()
。@Andrew当然,先生,从现在开始,我会小心的。Unicode的东西会在
getBytes()
调用中处理,尽管你真的应该传递一个像UTF-8这样的显式字符集。@Louis Wasserman,但这里我没有提到UTF-8,但是它正在使用,它是如何工作的,我很烦恼?@Andrew我会马上在平台上使用它
string.getBytes()
。这真是一个很好的答案,请注意,如果我使用一些印地语字符,它在任何支持西里尔字母的编码中也会被表示为字节吗?@RiteshKaushik nope,您需要支持Devanagari字符的编码。但是unicode包含了这个星球上使用的所有字符,所以您可以安全地使用UTF-8@Esailija:Thnx作为回复pa,但是如果文本是印地语,并且我没有在代码中的任何位置指定UTF-8,那么在我的情况下,它将使用默认编码ISO 8859-1,那么在这种情况下它是如何工作的,即使我使用的是“FileOutputStream”要将印地语字符写入文本文件(不使用UTF-8),它是否正确写入?@RiteshKaushik则默认编码不是ISO-8859-1。使用
Charset enc=Charset.forName(“ISO-8859-1”)尝试输出流您应该看到
,无,或获取错误。我正在使用“Charset.defaultCharset()”打印ISO-8859-1。另外,“Charset enc=Charset.forName(“ISO-8859-1”);”正在打印“ISO-8859-1”。这确实是一个很好的答案