gpt4 book ai didi

java - 如何从知道偏移量和长度的文件中获取特定字节?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:45:47 24 4
gpt4 key购买 nike

我有一个文件,文件的前4个字节是LOL 之类的魔法。我怎样才能获得这些数据?

我想象它会是这样的:

byte[] magic = new byte[4];
RandomAccessFile raf = new RandomAccessFile(file, "rw");
raf.read(magic, 0, magic.length);
System.out.println(new String(magic));

输出:

大声笑

很遗憾,这对我不起作用。我找不到获取特定值的方法。

有没有人知道解决这个问题的方法?

最佳答案

使用RandomAccessFile.seek()定位到您要阅读的位置和RandomAccessFile.readFully()读取完整的 byte 数组。

byte[] magic = new byte[4];
RandomAccessFile raf = new RandomAccessFile(file, "rw");
raf.seek(0L);
raf.readFully(magic);
System.out.println(new String(magic));

您的代码的问题在于,当您以读写模式创建文件时,文件指针很可能指向文件末尾。使用seek()方法定位。

您也可以使用 RandomAccessFile.read(byte[] b, int off, int len)方法也是如此,但偏移量和长度对应于开始存储读取字节的数组中的偏移量,长度指定要从文件中读取多少字节。但数据仍将从文件的当前位置读取,而不是从关闭位置读取。

因此,一旦您调用了 seek(0L);,此读取方法也有效:

raf.read(magic, 0, magic.length);

另请注意,读取和写入方法会自动移动当前位置,例如寻找 0L,然后读取 4 个字节(您的魔法字)将导致当前指针移动到4L。这意味着您可以随后调用读取方法,而不必在每次读取之前进行查找,并且它们将读取文件的连续部分并按位置增加,它们不会从同一位置读取。

最后的注释:

byte 数组创建 String 时,引用 String(byte[] bytes) 的 javadoc :

Constructs a new String by decoding the specified array of bytes using the platform's default charset.

因此将使用平台的默认字符集,在不同平台上可能会有所不同。总是像这样指定正确的编码:

new String(magic, StandardCharsets.UTF_8);

关于java - 如何从知道偏移量和长度的文件中获取特定字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26790224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com