我正在阅读下面代码中的文件,我想要做的是,能够以不同的编码方式读取文件,例如“big endian”,“little endian”。我在谷歌上寻找了这个,但我得到的是this link,我不清楚如何在inputStream
和bufferedStream
代码:
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));
答案 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_8
和ISO_8859_1
)可用的标准字符集。在你的情况下不是很有用。但您可以测试Charset的可用性:
Charset.availableCharsets()
答案 3 :(得分:0)
你也可以看看JBBP library允许读取以不同字节顺序写入的数据,有JBBPBitInputStream允许定义字节顺序(甚至是位顺序)