如何在不同的编码功能中读取文件?

时间:2014-12-04 13:12:42

标签: java encoding inputstream bufferedreader

我正在阅读下面代码中的文件,我想要做的是,能够以不同的编码方式读取文件,例如“big endian”,“little endian”。我在谷歌上寻找了这个,但我得到的是this link,我不清楚如何在inputStreambufferedStream

中使用它

代码

private void fileToHash(File myFile) throws IOException {
    // TODO Auto-generated method stub
    this.fileHash = new HashMap<Integer, DataRow>();

    InputStream iS = new FileInputStream(myFile);
    BufferedReader bR = new BufferedReader(new InputStreamReader(iS));

4 个答案:

答案 0 :(得分:2)

您应该将编码传递给InputStreamReader构造函数,例如

new InputStreamReader(iS, "UTF-16LE");

答案 1 :(得分:2)

Reader API用于处理具有不同字符集(或字符集)的文本文件,即ISO Latin,UTF,ASCII,EBCDIC。这只与endianess有轻微关系。

如果要读取以不同字节序列编码的二进制数据,可以自己读取字节,并通过移位或使用NIO's ByteBuffer来计算数字。要切换字节顺序,请使用order()方法。

相关文章:

答案 2 :(得分:2)

InputStream/byte[]是二进制文件,Reader/String是文本。桥接InputStreamReader具有可用于转换时使用的编码的参数。编码默认为平台编码。

InputStream iS = new FileInputStream(myFile);
BufferedReader bR = new BufferedReader(new InputStreamReader(iS, encoding));

测试文件所针对的编码,本身就是一门艺术。可以检测到违反UTF-8多字节编码的情况。对于ASCII文本(如果存在),ÚTF-16LE和~BE通常可以通过字节0x00在奇数或偶数位置检测到。我结合发现编码与识别语言,因为检测具有非ascii字符的单词可以帮助找到所使用的编码。使用每种语言中最常用的100个单词,以及每种语言的编码都有帮助。

您需要为FileChannel处理字节getChannel(),然后使用ByteBuffer。只需读取前4 KB就会产生最后一个字节的问题:UTF-8序列可能被截断,或UTF-16对被分割。

StandardCharsets中有Charset常量,但仅适用于每个JavaSE安装(例如StandardCharsets.UTF_8ISO_8859_1)可用的标准字符集。在你的情况下不是很有用。但您可以测试Charset的可用性:

Charset.availableCharsets()

答案 3 :(得分:0)

你也可以看看JBBP library允许读取以不同字节顺序写入的数据,有JBBPBitInputStream允许定义字节顺序(甚至是位顺序)