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

IAm*_*aja 20 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.
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有:

String fileName = getFileNameToReadFromUserInput();
InputStream is = new ByteArrayInputStream(fileName.getBytes());
InputStreamReader isr = new InputStreamReader(is, getCorrectCharsetToApply());
BufferedReader buffReader = new BufferedReader(isr);
Run Code Online (Sandbox Code Playgroud)

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

此外:

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

提前致谢!

Den*_*eng 30

所以,首先,作为一个抬头,确实意识到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);
Run Code Online (Sandbox Code Playgroud)

而不是试图制作FileReader.


dla*_*zon 5

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

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