Когда DataInputStream.skipBytes(n) не может пропускать n байтов?

StackOverflow https://stackoverflow.com/questions/51380

  •  09-06-2019
  •  | 
  •  

Вопрос

А Документация Sun для DataInput.skipBytes заявляет, что он «делает попытку пропустить n байтов данных из входного потока, отбрасывая пропущенные байты.Однако он может пропустить некоторое меньшее количество байтов, возможно, нулевое.Это может быть результатом любого из ряда условий;достижение конца файла до того, как будут пропущены n байтов, — это только одна возможность».

  1. Почему, кроме достижения конца файла, может skipBytes() не пропустить нужное количество байт?( DataInputStream Я использую либо обертку FileInputStream или PipedInputStream.)

  2. Если я определенно хочу пропустить n байт и выдать EOFException если это заставит меня перейти к концу файла, следует ли мне использовать readFully() и игнорировать полученный массив байтов?Или есть лучший способ?

Это было полезно?

Решение

1) Может быть не так много данных, доступных для чтения (другой конец канала, возможно, еще не отправил столько данных), и реализующий класс может быть неблокирующим (т.е.он просто вернет то, что может, вместо того, чтобы ждать достаточного количества данных для выполнения запроса).

Однако я не знаю, действительно ли какие-либо реализации ведут себя таким образом, но интерфейс спроектирован так, чтобы это разрешать.

Другой вариант — просто закрыть файл во время чтения.

2) Либо readFully() (который всегда будет ждать достаточного ввода, либо произойдет сбой), либо вызовите SkipBytes() в цикле.Я думаю, что первое, вероятно, лучше, если только массив не будет действительно огромным.

Другие советы

Я столкнулся с этой проблемой сегодня.Он считывал сетевое соединение на виртуальной машине, поэтому я предполагаю, что этому может быть несколько причин.Я решил это, просто заставив входной поток пропускать байты до тех пор, пока он не пропустит нужное мне количество байтов:

int byteOffsetX = someNumber; //n bytes to skip
int nSkipped = 0;

nSkipped = in.skipBytes(byteOffsetX);
while (nSkipped < byteOffsetX) {
    nSkipped = nSkipped + in.skipBytes(byteOffsetX - nSkipped);
}

Джош Блох недавно обнародовал это.Это соответствует тому, что InputStream.read не гарантированно прочитает столько байтов, сколько могло бы.Однако как метод API он совершенно бессмысленен.InputStream, вероятно, также должен иметь readFully.

Оказывается, readFully() увеличивает нагрузку на производительность больше, чем я был готов смириться.

В конце концов я пошел на компромисс:Я вызываю SkipBytes() один раз, и если он возвращает меньше нужного количества байтов, я вызываю readFully() для оставшихся байтов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top