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