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

时间:2012-08-23 17:12:47

标签: java file-io utf-8 character-encoding windows-1252

我正在尝试以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尝试读取文件名错误的编码...导致它死亡!

提前致谢!

3 个答案:

答案 0 :(得分:29)

所以,首先,作为一个抬头,确实意识到fileName.getBytes()就像你在那里得到文件名的字节,而不是文件本身。

其次,阅读FileReader的文档:

  

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

所以,听起来像FileReader实际上不是那样的。如果我们接受文档中的建议,那么您应该只更改代码:

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

并且根本不尝试制作FileReader。

答案 1 :(得分:4)

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

final BufferedReader reader =
        Files.newReader(new File(filename), getCorrectCharsetToApply());

答案 2 :(得分:3)

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

coalesce()