Java 如何在知道偏移量和长度的情况下从文件中提取特定字节?

Java 如何在知道偏移量和长度的情况下从文件中提取特定字节?,java,byte,randomaccessfile,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 遗憾的是,这对我不起作用。我找不到获取特定值的方法 有人找到解决此问

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

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

有人找到解决此问题的方法吗?

用于定位要读取的位置,并读取完整的
字节
数组

byte[] magic = new byte[4];
RandomAccessFile raf = new RandomAccessFile(file, "rw");
raf.seek(0L);
raf.readFully(magic);
System.out.println(new String(magic));
代码的问题在于,在读写模式下创建文件时,文件指针很可能指向文件的末尾。使用
seek()
方法定位

也可以使用该方法,但偏移量和长度对应于数组中开始存储读取字节的偏移量,而长度指定从文件中读取的字节数。但数据仍将从文件的当前位置读取,而不是从关闭位置读取

因此,一旦调用
seek(0L),此读取方法也适用于:

raf.read(magic, 0, magic.length);
还请注意,读写方法将自动移动当前位置,因此,例如,寻求
0L
,然后读取4个字节(您的魔术字)将导致当前指针移动到
4L
。这意味着您可以随后调用read方法,而无需在每次读取之前进行查找,并且它们将读取文件的连续部分(按位置递增),而不会从同一位置读取

最后一个注释:

字节
数组创建
字符串
时,引用以下内容的javadoc:

通过使用平台的默认字符集对指定的字节数组进行解码来构造新字符串

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

new String(magic, StandardCharsets.UTF_8);

很好,谢谢。我从来没有听说过英国皇家空军是这样实施的。谢谢;)我会在7分钟内接受你的回答(stackoverflow限制)。@user3530525没问题:)