【问题标题】:Writing bytes to file then reading yields different bytes将字节写入文件然后读取会产生不同的字节
【发布时间】:2015-04-28 23:47:49
【问题描述】:

我有一个程序需要从文件中读取和写入 RGB 值。但是,我遇到了应用程序的问题,我从文件中读取的数据与写入的数据不同。

程序:

public static void main(String[] args) throws Exception {
    FileOutputStream fos = new FileOutputStream(new File("ASDF.txt"));
    fos.write(0xFF95999F);
    fos.flush();
    fos.close();
    FileInputStream fis = new FileInputStream(new File("ASDF.txt"));
    byte read;
    while((read = (byte) fis.read()) != -1) {
        System.out.print(String.format("%02X ", read));
    }
    fis.close();
}

输出:

9F

【问题讨论】:

    标签: java file io java-io


    【解决方案1】:

    一个字节是 8 位,这意味着它最多可以存储 255 个(如果有符号则为 128 个)。当您调用 fos.write(0xFF95999F) 时,它会将其转换为一个字节,这意味着它会删除除最后两个数字(十六进制)之外的所有数字。如果您需要写入多个字节,则需要将整数转换为字节数组。正如a related SO article 中所建议的,类似

    ByteBuffer b = ByteBuffer.allocate(4);
    //b.order(ByteOrder.BIG_ENDIAN); // optional, the initial order of a byte buffer is always BIG_ENDIAN.
    b.putInt(0xFF95999F);
    
    byte[] result = b.array();
    fos.write(result);
    ...
    

    应该更适合你。 (为什么 FileOutputStream 需要一个 int 而不是一个字节,我无法回答,但我想这也是为什么一些获取列表的 Java 方法(想到 getCookie)返回 null 而不是空列表的愚蠢原因......为时过早他们现在坚持的优化。)

    【讨论】:

    • 空列表和不存在列表是有区别的。在您提到的情况下返回一个空列表仅在 cookie 标头不存在且没有值的情况下才合适。
    • 好吧,我的意思是 getCookies (docs.oracle.com/javaee/5/api/javax/servlet/http/…) ... 请注意,HttpServletRequest 没有 getCookie 方法,这是该 API 的另一个烦恼。
    猜你喜欢
    • 2017-12-02
    • 2017-07-11
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多