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

时间:2014-11-06 22:01:08

标签: java byte randomaccessfile

我有一个文件,文件的前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));

输出:

LOL

可悲的是,这对我不起作用。我无法找到获取特定值的方法。

有没有人看到任何方法来解决这个问题?

1 个答案:

答案 0 :(得分:5)

使用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)方法,但偏移量和长度对应于数组中的偏移量开始存储读取字节的位置,而length指定了多少字节数从文件中读取。但数据仍会从文件的当前位置中读取,而不是从off位置读取。

所以一旦你打电话给seek(0L);,这个读取方法也有效:

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

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

最后注意:

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

  

使用平台的默认字符集解码指定的字节数组,构造一个新的字符串。

因此将使用平台的默认字符集,这些字符集可能在不同平台上有所不同。始终指定正确的编码,如下所示:

byte