如何从知道偏移量和长度的文件中提取特定字节?
我有一个文件,文件的前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
可惜这对我不起作用。我找不到获取特定值的方法。
有没有人看到解决此问题的任何方法?
回答:
使用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)方法,但是offset和length对应
中开始存储读取字节的偏移量,length指定要从文件读取的字节数。但是仍然会从 的
读取数据,而不是从该off
位置读取数据。
因此,一旦您调用seek(0L);
,此read方法也将起作用:
raf.read(magic, 0, magic.length);
还要注意,读取和写入方法将自动移动当前位置,因此例如进行搜索0L
,然后读取4个字节(您的魔术字)将导致当前指针移动到4L
。这意味着您可以随后调用读取方法,而不必在每次读取之前都先查找,并且它们将读取文件的连续部分(按位置增加),而不会从同一位置读取。
String
从byte
数组创建时,请引用javadoc中的String(byte[]
bytes):
通过使用 解码指定的字节数组来构造新的String 。
因此,将使用平台的默认字符集,这在不同平台上可能会有所不同。始终像这样指定正确的编码:
new String(magic, StandardCharsets.UTF_8);
以上是 如何从知道偏移量和长度的文件中提取特定字节? 的全部内容, 来源链接: utcz.com/qa/405360.html