28

我正在尝试根据此方法的输出以 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);

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

此外:

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

提前致谢!

4

3 回答 3

31

所以,首先,作为一个提醒,要意识到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);

并且根本不尝试制作 FileReader。

于 2012-08-23T17:30:02.303 回答
6

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

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

于 2017-10-25T21:05:47.890 回答
4

请注意,如果您使用的是Google Guava,您可以使用Files.newReader

final BufferedReader reader =
        Files.newReader(new File(filename), getCorrectCharsetToApply());
于 2015-07-15T00:40:03.310 回答