encoding/character 设置 Java 默认使用什么 BufferedReader?

What encoding/character set does Java use per default for BufferedReader?

当我们创建新的 BufferedReader 对象而不显式提供编码时,Java 默认使用什么 encoding/character 设置?

例如:

try (final BufferedReader reader = new BufferedReader(new FileReader("my_file.txt"))) {
  reader.readLine(); // What encoding is used to read the file?
}

FileReader 是一个 InputStreamReader,它使用 FileInputStream 作为输入,而 InputStreamReader 在没有指定字符集的情况下构造时使用默认字符集。

源码jdk10中,使用Charset.defaultCharset():

public static StreamDecoder forInputStreamReader(InputStream in,
                                                 Object lock,
                                                 String charsetName)
    throws UnsupportedEncodingException
{
    String csn = charsetName;
    if (csn == null)
        csn = Charset.defaultCharset().name(); // get default charset
    try {
        if (Charset.isSupported(csn))
            return new StreamDecoder(in, lock, Charset.forName(csn));
    } catch (IllegalCharsetNameException x) { }
    throw new UnsupportedEncodingException (csn);
}

哪个

Returns the default charset of this Java virtual machine.

The default charset is determined during virtual-machine startup and typically depends upon the locale and charset of the underlying operating system.

可以打印:

public static void main(String[] args) {
    System.out.println(Charset.defaultCharset());
}

BufferedReader 不做任何解码。它是另一个 Reader 的包装器......可能会也可能不会解码。

FileReader decodes using the JVM's default character encoding, as returned by Charset.defaultCharset()

javadoc 指出:

Convenience class for reading character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are appropriate. To specify these values yourself, construct an InputStreamReader on a FileInputStream.