如何使用特定字符编码在Java中读取文件?

我正在尝试以UTF-8或Windows-1252的形式读取文件,具体取决于此方法的输出:

public Charset getCorrectCharsetToApply() {
    // Returns a Charset for either UTF-8 or Windows-1252.
}

到目前为止,我有:

String fileName = getFileNameToReadFromUserInput();
InputStream is = new ByteArrayInputStream(fileName.getBytes());
InputStreamReader isr = new InputStreamReader(is, getCorrectCharsetToApply());
BufferedReader buffReader = new BufferedReader(isr);

我遇到的问题是将实例转换为.BufferedReaderFileReader

此外:

  • 不能将文件本身的名称 () 信任为特定 ;有时文件名将包含 UTF-8 字符,有时包含 Windows-1252。文件的内容也是如此(但是,如果文件名和文件内容始终具有匹配的字符集)。fileNameCharset
  • 只有内部的逻辑才能选择要应用的字符集,因此在调用此方法之前尝试按文件名读取文件可能会导致Java尝试使用错误的编码读取文件名...这导致它死亡!getCorrectCharsetToApply()

提前致谢!


答案 1

因此,首先,请注意,请注意,因为您有文件名的字节,而不是文件本身。fileName.getBytes()

其次,阅读FileReader的文档:

此类的构造函数假定默认字符编码和默认字节缓冲区大小是合适的。若要自己指定这些值,请在 FileInputStream 上构造 InputStreamReader。

所以,听起来FileReader实际上不是要走的路。如果我们采纳文档中的建议,那么您应该只需更改代码即可:

String fileName = getFileNameToReadFromUserInput();
FileInputStream is = new FileInputStream(fileName);
InputStreamReader isr = new InputStreamReader(is, getCorrectCharsetToApply());
BufferedReader buffReader = new BufferedReader(isr);

并且根本不尝试制作文件阅读器。


答案 2

使用 Java 7+,您可以在一行中创建 Reader:

BufferedReader buffReader = Files.newBufferedReader(Paths.get(fileName), getCorrectCharsetToApply());