当前位置: 首页 > 面试题库 >

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

方英耀
2023-03-14
问题内容

我有一个文件,文件的前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。这意味着您可以随后调用读取方法,而不必在每次读取之前都先查找,并且它们将读取文件的连续部分(按位置增加),而不会从同一位置读取。

最后说明:

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

通过使用 平台的默认charset 解码指定的字节数组来构造新的String 。

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

new String(magic, StandardCharsets.UTF_8);


 类似资料:
  • 问题内容: 嘿,我正在尝试打开文件,仅从偏移量读取一定长度!我阅读了以下主题: 如何使用Java中的文件中的特定行号读取特定行? 在那儿,它说在不读取之前就不可能读取某行,但是我想知道字节! 是否可以从已知偏移量读取某些字节? 问题答案: RandomAccessFile提供一个功能:

  • 如果文件很小,我就工作。但是,当文件变大时,偏移量将小于实际值。我怎样才能得到抵消?

  • 问题内容: .eg 1. 日志文件 开始 1号线 2号线 3号线 结束 从头开始读取文件时,我就能获得Line1的搜索位置。 但这不是解决问题的有效方法,因为随着文件大小的增加,获取位置的时间也会增加。我想从EOF位置获取线的位置,我认为这样会更有效。 问题答案: 注意: 我优化并改进了以下解决方案,并将其作为库发布在这里: 使用a 作为其源,它不支持从任意位置进行查找和/或读取,因此它无法从头开

  • 可以从输入主题的特定偏移量到结束偏移量进行Kafka流处理吗? 我有一个Kafka流应用程序消耗输入主题,但由于某种原因失败了。我修复了问题并再次启动它,但它从输入主题的最新偏移量开始消耗。我知道应用程序已处理的输入主题的偏移量。现在,我如何将输入主题从一个偏移量处理到另一个偏移量。我正在使用合流平台5.1.2。

  • 示例: 我想提取svg文件的宽度和高度,这样我就可以用Canvg做一些定位。 我知道这是xml,但我想不通。这可能是件很容易的事,但这是一年中的最后一天,我想不通。 一直在尝试: PHP SimpleXML 给我数组([]=>http://www.w3.org/2000/svg) 这也行不通: 有什么想法吗?

  • 编辑:到目前为止,我所见过的每一个类似LineReader的类似乎都被缓冲了。有没有人知道一个无缓冲的类linereader类?