我需要通过传递索引来读取结构化二进制文件的一部分。但是,DataInputStream不支持标记/重置。我怎样才能实现我想要的?有没有其他的课程可以让我轻松地做到这一点?
import java.io.*;
import java.io.DataOutputStream;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
class Test {
public static int getInt(DataInputStream stream, int index) throws IOException {
int offset = index * 4; // size of int
stream.reset();
stream.skip(offset);
return stream.readInt();
}
public static void main(String[] args) {
String filename = "test.data";
try {
DataOutputStream ostream = new DataOutputStream(new FileOutputStream(filename));
for (int i=0; i<10; i++) {
ostream.writeInt(i);
}
ostream.close();
DataInputStream istream = new DataInputStream(new FileInputStream(filename));
istream.mark(0);
int i0 = getInt(istream, 0);
int i3 = getInt(istream, 3);
int i5 = getInt(istream, 5);
System.out.printf("i0 = %d, i3 = %d, i5 = %dn", i0, i3, i5);
istream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
不是DataInputStream不支持标记/重置。DataInputStream只是将标记/重置的调用委托给底层流(在本例中是FileInputStream)。然而,FileInputStream不支持标记/重置操作(iirc)。这个问题的解决方案是首先将FileInputStream包装在BufferedInputStream中,然后再将其传递给DataInputStream。这样就可以使用所需的操作。即:
DataInputStream istream = new DataInputStream(new BufferedInputStream(new FileInputStream(filename)));
同样,我也不完全确定,但据我所知,你可能错误地使用了mark的参数。根据JavaDoc,参数的意思是:
因此,带参数0调用mark并不是特别有用。标记位置失效前可读取的最大字节限制。
在BufferedInputStream中进行换行,它实现了mark
顺便说一句,你的mark调用应该给出你期望在重置发生之前读取的字节数。如果读取超过该标记,则该标记无效,reset将抛出
或者使用RandomAccessFile