【问题标题】:Reading integer values stored as their ascii characters in java在java中读取存储为ascii字符的整数值
【发布时间】:2014-11-11 12:56:22
【问题描述】:

ImageMagick 的原始 rgb 数据格式基本上是将一些整数作为 ascii 值保存到文件中。例如当它存储 42 并且我在简单的文本编辑器中打开日期时,我在该位置看到“*”(或 36->$ ...)。 我想将这些值读入 java 程序。我已经尝试过类似的方法:

br = new BufferedReader(new FileReader(fileName));          
while ((sCurrentLine = br.readLine()) != null) {                
    for (int i=0;i<sCurrentLine.length();i++) {
        char chr = sCurrentLine.charAt(i);
        int ascii = (int) chr;
    }
}

这样我可以按原样读取值,但是某些特定字符(例如换行符 (NL ascii:10) 或类似字符)存在问题。 有没有更好的方法来读取像二进制读取这样的文件?

【问题讨论】:

  • 不要使用readLine()。使用read()。但这看起来更像是字节而不是字符。所以你应该使用 InputStream。
  • @JBNizet mmaped Reader 可能会更好。

标签: java file io ascii


【解决方案1】:
byte[] bytes = Files.readAllBytes(Paths.get("C:/temp/test.png"));

一个字节是介于 -128 和 127 之间的值(有符号)。对于无符号值:

int value = bytes[i] & 0xFF;

现在 java 有点特殊,因为 char 和 String 保存 Unicode 文本,所以 FileReader 会从文件中字节的默认平台编码进行转换。除了效率低下,在 Linux 服务器上,默认编码可能是 UTF-8,一种多字节编码。那将失败,不会给出 char 和 byte 之间的一一对应关系。在西欧 Windows 上,特殊引号可能变成大于 255 的高 Unicode 字符。

所以最好不要将 char/String/Reader/Writer 用于纯二进制数据。

【讨论】:

    猜你喜欢
    • 2013-03-01
    • 2012-03-21
    • 2021-07-29
    • 2018-03-20
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    相关资源
    最近更新 更多