FileInputStream отрицательный пропуск - PullRequest
2 голосов
/ 11 марта 2010

Я пытаюсь узнать больше об истории операции java.io.FileInputStream.skip(n), когда n отрицательно. Согласно документации InputStream :

Если n отрицательно, байты не пропускаются.

Похоже, что реализация FileInputStream от Sun вместо этого использовала IOException , который теперь также задокументирован в Javadoc :

Если n отрицательно, генерируется IOException, хотя метод пропуска суперкласса InputStream ничего не делает в этом случае.

Я только что попробовал это, и обнаружил, что FileInputStream.skip(-10) действительно вернул -10! Это не бросило исключение, оно даже не вернуло 0, оно вернуло -10. (Я пробовал использовать Java 1.5.0_22 от Sun и Java 1.6.0_18 от Sun).

Это известная ошибка? Почему это не было исправлено, или почему документация не изменилась? Может ли кто-нибудь указать мне на обсуждение этой проблемы? Я ничего не могу найти.

1 Ответ

0 голосов
/ 12 марта 2010

Актуальная реализация SocketInputStream дает ответ:

  public long skip(long numbytes) throws IOException {
        if (numbytes <= 0) {
            return 0;
        }
  ...
  }

РЕДАКТИРОВАТЬ: Извините, я проверил неправильный класс FileInputStream s реализация является нативной, это реализация в openjdk7

if ((cur = IO_Lseek(fd, (jlong)0, (jint)SEEK_CUR)) == -1) {
        JNU_ThrowIOExceptionWithLastError(env, "Seek error");
    } else if ((end = IO_Lseek(fd, toSkip, (jint)SEEK_CUR)) == -1) {
        JNU_ThrowIOExceptionWithLastError(env, "Seek error");
    }
    return (end - cur);
...