Java:哪些是用于Sytem.out/in/err文件的隐式编码?

Java:哪些是用于Sytem.out/in/err文件的隐式编码?,java,encoding,charset,Java,Encoding,Charset,第一个任务:我想从System.in读入一个阅读器。 看来这是通过 InputStreamReader cin = new InputStreamReader(System.in); 还有其他的构造器包括一个编码。 目前还不清楚默认编码是什么。 据我所知,System.in只是一个字节流。 而InputStreamReader读取字符。 但是InputStream的构造函数在哪里知道字符集呢? 我必须应用特定的字符集吗?如果是这样的话,我应该放弃哪一个呢 根据有关System.out和Syst

第一个任务:我想从System.in读入一个阅读器。 看来这是通过

InputStreamReader cin = new InputStreamReader(System.in);
还有其他的构造器包括一个编码。 目前还不清楚默认编码是什么。 据我所知,System.in只是一个字节流。 而InputStreamReader读取字符。 但是InputStream的构造函数在哪里知道字符集呢? 我必须应用特定的字符集吗?如果是这样的话,我应该放弃哪一个呢

根据有关System.out和System.err的问题。 两者似乎都是打印流,尤其是读取字节

OutputStreamWriter out  = new OutputStreamWriter(System.out);
好的,选择正确的编码还是必须使用不同的构造函数

那System.err呢

还有什么字符集

我对吹笛手/作家提出了同样的问题。 至少他们必须一致,对吗

对于StringWriter/Reader:与字符串编码相同,即utf8,对吗

最后一个关于档案的问题。 FileReader/Writer是InputStreamReader/Writer的子类。 这似乎是合理的,因为文件是一个字节序列。 但与InputStreamReader/Writer的构造函数不同, 其中有带字符集的构造函数,FileReader/Writer没有。 他们怎么知道文件的编码

谢谢你的澄清

我想通过
从System.in读入读卡器
InputStreamReader cin=新的InputStreamReader(System.in)
目前还不清楚默认编码是什么。据我所知,System.in只是一个字节流。而InputStreamReader读取字符。但是InputStream的构造函数在哪里知道字符集呢

一个人如果想知道Java标准库的某个元素,可以想当然地查看文档,即

创建使用默认字符集的InputStreamReader

在旧版本中,它实际上是一个超链接,但不再是。然而,页面顶部描述整个班级的文字说

InputStreamReader是从字节流到字符流的桥梁:它读取字节并使用指定的字符集将其解码为字符。它使用的字符集可以通过名称指定,也可以显式指定,或者可以接受平台的默认字符集

这个字符集没有超链接,上面写着

Java虚拟机的每个实例都有一个默认字符集,它可能是标准字符集之一,也可能不是。默认字符集在虚拟机启动期间确定,通常取决于基础操作系统使用的区域设置和字符集

和文档来查找默认值

我必须应用特定的字符集吗?如果是这样的话,我应该放弃哪一个呢

取决于您将要读取的数据。如果Java是从“终端”(在Unix中)或“控制台”(在Windows中)使用其标准输入运行的,则用户的输入通常会与操作系统中设置的区域设置(或Windows代码页)相匹配,如上所述,该区域设置用于Java默认设置,因此您可以使用默认设置。如果输入将从文件(或Unix上的“herdoc”,实际上是临时文件)重定向,则取决于文件中的内容;如果输入将从另一个程序的管道重定向(在某些Unix shell上,包括进程替换),这取决于其他程序的输出——如果它运行在同一个系统中,则可能(但不确定)使用与Java进程设置相同的语言环境

根据有关System.out和System.err的问题。两者似乎都是打印流,尤其是读取字节

OutputStreamWriter out  = new OutputStreamWriter(System.out);
(旁白:“根据”不符合语法。你可以说“相应的问题”,但“相同的问题”是正确的,而且更清楚。)

是的,
System.out.err
PrintStream
(或一个子类)的实例,这是一种特殊情况和混合类型;它与任何其他
OutputStream
一样处理写入(而不是读取)字节,但也具有与
PrintWriter
相同的
print*
printf/format
方法。实际的
PrintWriter
会将输出格式化(如有必要)为字符,并(通常)将它们传递给
OutputStreamWriter
,后者将字符编码为字节并传递给底层流,但
PrintStream
本身进行格式化和编码,直接输出字节。查看ctor列表,可以看到可以指定字符集名称或对象,也可以使用默认值;
System.out.err
的实现使用默认值

如果您确实在这些
PrintStream
s的(流部分)上创建了自己的
OutputStreamWriter
,您可以指定任何字符集或使用默认值——尽管如果要使用默认值,为什么不直接使用
PrintStream

还有什么字符集

如果你指的是这个概念,请参阅我上面链接的类文档。如果您的意思是给定JVM上有哪些特定的字符集可用,那么这可能会有所不同。您可以使用该类中的静态方法
availableCharsets()
在某个时间点获取当前列表

我对吹笛手/作家提出了同样的问题。至少它们必须重合,对吗?
对于StringWriter/Reader:与字符串编码相同,即utf8,对吗

这些是不同的。它们不是以字节为单位工作的,至少不可见

首先,Java
String
被定义为由16位
char
s组成,而不是字节。最初,当Unicode也是16位时,这些是真正的字符(现在称为UCS-2)。当Unicode增长超过16位,但Java无法轻易改变以跟上时,这些就变成了UTF-16代码元素,这些元素主要是字符,但有一组称为代理项,成对使用以表示“补充”字符。重新