use*_*525 3 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));
Run Code Online (Sandbox Code Playgroud)
输出:
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));
Run Code Online (Sandbox Code Playgroud)
代码的问题在于,当您以读写模式创建文件时,文件指针很可能指向文件的末尾.使用该seek()方法定位.
您也可以使用该RandomAccessFile.read(byte[] b, int off, int len)方法,但偏移量和长度对应于数组中开始存储读取字节的偏移量,length指定从文件中读取的字节数.但仍然会从文件的当前位置读取数据,而不是从off位置读取数据.
所以一旦你打电话seek(0L);,这个读取方法也有效:
raf.read(magic, 0, magic.length);
Run Code Online (Sandbox Code Playgroud)
另请注意,读取和写入方法将自动移动当前位置,因此例如寻找0L,然后读取4个字节(您的魔术字)将导致当前指针移动到4L.这意味着您可以随后调用读取方法而无需在每次读取之前进行搜索,并且它们将按位置读取文件的连续部分,它们将不会从相同位置读取.
最后注意:
String从byte数组创建时,引用javadoc String(byte[] bytes):
通过使用平台的默认字符集解码指定的字节数组构造一个新的String .
因此,将使用平台的默认字符集,这可能在不同平台上有所不同.始终指定正确的编码,如下所示:
new String(magic, StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2836 次 |
| 最近记录: |