Java:哪些是用于Sytem.out/in/err文件的隐式编码?
第一个任务:我想从System.in读入一个阅读器。 看来这是通过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
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,对吗
这些是不同的。它们不是以字节为单位工作的,至少不可见
首先,JavaString
被定义为由16位char
s组成,而不是字节。最初,当Unicode也是16位时,这些是真正的字符(现在称为UCS-2)。当Unicode增长超过16位,但Java无法轻易改变以跟上时,这些就变成了UTF-16代码元素,这些元素主要是字符,但有一组称为代理项,成对使用以表示“补充”字符。重新