【问题标题】:How to read fie in different encoding functions?如何以不同的编码功能读取文件?
【发布时间】:2015-02-02 09:18:14
【问题描述】:

我正在读取如下代码所示的文件,我想要做的是,能够以不同的编码读取文件,例如“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));

【问题讨论】:

标签: java encoding inputstream bufferedreader


【解决方案1】:

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

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

【讨论】:

  • 谢谢。 1-编码名称是类常量吗?因为我知道 ecncoding s 但不知道拼写或示例。2- 如果未指定编码,是否有默认值?
  • StandardCharsets 中有几个常量。默认值取决于操作系统。
  • 我检查了你提到的那个类,但没有字节序?
  • 1 - 您可以找到 JRE 支持的编码为 Charset.availableCharsets(); 2 - Java 采用操作系统的默认编码,您可以通过 System.getProperty("file.encoding); 找到它
【解决方案2】:

Reader API 旨在处理具有不同字符集(或字符集)的文本文件,即 ISO Latin、UTF、ASCII、EBCDIC。这仅与字节序有关。

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

相关文章:

【讨论】:

    【解决方案3】:

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

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

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

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

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

    Charset.availableCharsets()
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2017-11-12
        • 1970-01-01
        • 2016-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-05
        • 2023-03-10
        • 1970-01-01
        相关资源
        最近更新 更多