解码 System#lineSeparator 的正确字符集是什么?

问题描述 投票:0回答:1

假设我们需要验证以下方法。

    /**
     * Prints {@code hello, world}, to the {@link System#out}, followed by a system dependent line separator.
     *
     * @param args command line arguments.
     */
    public static void main(String... args) {
        System.out.printf("hello, world%n"); // %n !!!!!!
    }

现在我们可以验证该方法是否打印了

hello, world

    /**
     * Verifies that the {@link HelloWorld#main(String...)} method prints {@code hello, world}, to the
     * {@link System#out}, followed by a system-dependent line separator.
     *
     * @author Jin Kwon <onacit_at_gmail.com>
     * @see System#lineSeparator()
     */
    @DisplayName("main(args) prints 'hello, world' followed by a system-dependent line separator")
    @Test
    public void main_PrintHelloWorld_() {
        final var out = System.out;
        try {
            // --------------------------------------------------------------------------------------------------- given
            final var buffer = new ByteArrayOutputStream();
            System.setOut(new PrintStream(buffer));
            // ---------------------------------------------------------------------------------------------------- when
            HelloWorld.main();
            // ---------------------------------------------------------------------------------------------------- then
            final var actual = buffer.toByteArray();
            final var expected = ("hello, world" + System.lineSeparator()).getBytes(StandardCharsets.US_ASCII);
            Assertions.assertArrayEquals(actual, expected);
        } finally {
            System.setOut(out);
        }
    }

有问题的部分是

.getBytes(StandardCharsets.US_ASCII)

我认为假设 系统相关的行分隔符使用

US_ASCII
进行编码并没有错。

Charset#defaultCharset() 是否适合

%n

java newline charset trailing-newline
1个回答
0
投票

您应该使用与

buffer.toByteArray()
返回的字节数组相同的编码。

将字符串转换为字节是

PrintStream
的工作,那么你的
PrintStream
使用什么编码?您通过调用
this 构造函数
创建了 PrintStream。文档说:

写入流中的字符将使用默认字符集转换为字节,或者其中 out 是 PrintStream,即打印流使用的字符集。

所以你应该使用

Charset.defaultCharset()
来解码字节数组。

© www.soinside.com 2019 - 2024. All rights reserved.