我有一个文件,里面有一些数据。每个数据块都有一个索引起始位置,因此我可以快速访问它。根据程序的启动方式(通过 IDE 或打开 .jar 文件),doinginput.read()
会产生不同的结果。
这是我使用的代码块:
注意:它似乎只发生在那个文件上。
public static void main(String[] args) throws Exception
{
//The index is at position 137.
int indexPos = (Character.SIZE / 8) * 137;
InputStream stream = InputStream stream = Test.class.getResourceAsStream("/data/data.dat");
int response = JOptionPane.showConfirmDialog(null, "Use skip?");
if (response == JOptionPane.YES_OPTION)
{
//Skips bytes to get to index position.
stream.skip(indexPos);
}
else
{
//Reads bytes to get to index position.
stream.read(new byte[indexPos]);
}
byte[] contentStart = new byte[2];
stream.read(contentStart);
//The content itself start at this position.
int contentStartPos = ByteBuffer.wrap(contentStart).order(ByteOrder.BIG_ENDIAN).asCharBuffer().get();
int response = JOptionPane.showConfirmDialog(null, "Use skip?");
if (response == JOptionPane.YES_OPTION)
{
//Skips bytes to get to the correct position.
stream.skip(contentStartPos - indexPos - 2);
}
else
{
//Reads bytes to get to the correct position.
stream.read(new byte[contentStartPos - indexPos - 2]);
}
JOptionPane.showMessageDialog(null, "Should be 0 and is: "+stream.read());
}
这是最后读取的字节的值:
//The correct value needed is 0.
In IDE & yes yes: 108
In IDE & no no: 0
In IDE & yes no: 0
In IDE & no yes: 112
Via JAR & yes yes: 0
Via JAR & no no: 4
Via JAR and yes no: 4
Via JAR and no yes: 0
如您所见,为了获得正确的值,第一次跳过/读取并不重要。只有第二个。
我很想有人向我解释为什么会发生这种情况。
编辑:这是第二次跳过的值:
//The correct value is 8235.
In IDE using skip: 8190
In IDE using read: 8235
Via JAR using skip: 8235
Via JAR using read: 8192