我想读一个文件中为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的尝试与错误的编码读取文件名非常出色导致之前 ...这会导致它死!
提前致谢!
因此,首先,作为一抬头,一定要明白, 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可言。
请注意,如果您使用的是谷歌番石榴 ,您可以使用Files.newReader
:
final BufferedReader reader =
Files.newReader(new File(filename), getCorrectCharsetToApply());
在Java 7 +,你可以在一行中创建读者:
BufferedReader buffReader = Files.newBufferedReader(Paths.get(fileName), getCorrectCharsetToApply());