当我将编码设置为 UTF-16 时,为什么 FileInputStream readline returns null?

Why FileInputStream readline returns null when I set encoding to UTF-16?

它与 UTF-8 一起工作正常,如果我使用不同的文件,它也与 UTF-16 一起工作。

BufferedReader br = new BufferedReader(new InputStreamReader(new 
FileInputStream(filePath), "UTF-16"));

如果我在上面的代码中将 UTF-16 替换为 UTF-8,一切都会按预期进行,这是为什么?

建议的答案不同,因为我只需要阅读文件。答案很简单,如果文件是 UTF-8,我无法读取 UTF-16。

检查文件的编码。 UTF-16 可以使用 Big Endian (UTF-16BE) 或 Little Endian (UTF-16LE) 进行编码。这些是不同的。

此代码适用于同一文件的四个变体。

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class SOPlayground {

    public static void main(String[] args) throws Exception {
        readAndPrint("/tmp/u-8.txt", Charset.forName("UTF-8"));
        readAndPrint("/tmp/u-16.txt", Charset.forName("UTF-16"));
        readAndPrint("/tmp/u-16le.txt", Charset.forName("UTF-16LE"));
        readAndPrint("/tmp/u-16be.txt", Charset.forName("UTF-16BE"));
    }

    private static void readAndPrint(String filePath, final Charset charset) throws IOException, FileNotFoundException {
        final BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), charset));
        String line = br.readLine();
        while (line != null) {
            System.out.println(line);
            line = br.readLine();
        }
    }
}

在 GNU/Linux 上,您可以使用 file 工具检查编码:

/tmp % file u*.txt
u-16be.txt: data
u-16le.txt: data
u-16.txt:   Little-endian UTF-16 Unicode text, with no line terminators
u-8.txt:    UTF-8 Unicode text

这些文件的内容都不一样:

/tmp % cat u*.txt
����
����
������
üäöü

但是使用上面的Java代码,是可以正确读取的。我的 Java 代码的输出是:

üäöü
üäöü
üäöü
üäöü