0

いくつかのデータを含むファイルがあります。各データ チャンクにはインデックス付きの開始位置があるため、すばやくアクセスできます。プログラムの起動方法 (IDE 経由または .jar ファイルを開く) に応じてinput.read()、異なる結果が得られます。

これは私が使用するコードブロックです:

注意: その 1 つのファイルにのみ発生するようです。

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

ご覧のとおり、正しい値を取得するために、最初のスキップ/読み取りは問題ではありません。2つ目だけ。

どうしてこうなったのか、どなたか教えていただきたいです。

編集:2回目にスキップされる値は次のとおりです。

//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
4

1 に答える 1