Java: чтение против readNBytes экземпляра InputStream - PullRequest
0 голосов
/ 13 декабря 2018

В Java класс InputStream имеет методы read(byte[], int, int) и readNBytes(byte[], int, int).Кажется, что эти два метода имеют абсолютно одинаковую функциональность, поэтому мне интересно, в чем различия между ними.

1 Ответ

0 голосов
/ 13 декабря 2018

Вы правы, что javadocs очень похожи.В случае сомнений всегда опускайтесь до источника.Большинство IDE облегчают присоединение источника OpenJDK и позволяют перейти к ним.

Это readNBytes из InputStream.java :

public int readNBytes(byte[] b, int off, int len) throws IOException {
    Objects.requireNonNull(b);
    if (off < 0 || len < 0 || len > b.length - off)
        throw new IndexOutOfBoundsException();
    int n = 0;
    while (n < len) {
        int count = read(b, off + n, len - n);
        if (count < 0)
            break;
        n += count;
    }
    return n;
}

AsВы можете видеть, что на самом деле он выполняет вызов read(byte[],int,int).Разница в этом случае заключается в том, что если фактические прочитанные байты меньше указанных вами len, , он будет пытаться снова прочитать () , пока не будет подтверждено, что на самом деле ничего не осталось для чтения.

Редактировать: Обратите внимание, что

  1. Это реализация OpenJDK базы InputStream.Другие могут отличаться.
  2. Подклассы InputStream также могут иметь собственную переопределенную реализацию.Обратитесь к документу / источнику для соответствующего класса.
...