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

我试图以UTF-8或Windows-1252的forms读取文件,具体取决于此方法的输出:

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尝试使用错误的编码读取文件名…这会导致它死了!

提前致谢!

所以,首先,作为一个抬头,确实知道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。

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

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

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

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