Обнаружение, находится ли EOF в начале или где-то в середине в readInt - PullRequest
0 голосов
/ 15 июня 2011

Я использую следующее для чтения пакета данных из DataInputStream (обернутого вокруг сокета).

    DataInputStream ins = ....;
    boolean cleanBreak = true;

    try {

        synchronized (readLock) {

            // read: message length
            int ml = ins.readInt();
            cleanBreak = false;

            // read: message data
            byte[] msg = IO.readBytes(ins, ml);

        }

    } catch (IOException e) {


            final boolean eof = e instanceof EOFException && cleanBreak;

        ...

Используя логическое значение cleanBreak, я хочу определить, является ли EOFпроисходит в середине пакета (внезапно) или между двумя пакетами.В настоящее время это работает, когда EOF находится в части данных, но не если он находится в заголовке (int), например, если при чтении заголовка осталось только 2 байта.

Как я могу это сделать?

1 Ответ

0 голосов
/ 15 июня 2011

Один из способов - встроить readInt:

public final int readInt() throws IOException {
    int ch1 = in.read();
    int ch2 = in.read();
    int ch3 = in.read();
    int ch4 = in.read();
    if ((ch1 | ch2 | ch3 | ch4) < 0)
        throw new EOFException();
    return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
}

и адаптировать его со специальной проверкой первого байта.

...