Сегмент чтения из потока .Net из потока - PullRequest
1 голос
/ 29 июня 2010

Я пытаюсь найти способ прочитать часть потока.У меня есть поток с 40000 байтами, и мне нужно только чтение с позиции 8000 до 15000, вероятно, что-то простое, но я не могу найти простой способ получить сегмент потока.

Ответы [ 2 ]

2 голосов
/ 29 июня 2010

Если поток поддерживает поиск, вы можете просто перейти к позиции, в противном случае вам нужно прочитать поток, чтобы попасть в эту позицию:

if (theStream.CanSeek) {
  theStream.Seek(8000, SeekOrigin.Current);
} else {
  // read 8000 bytes and throw away
}
// read the 7000 bytes to keep
0 голосов
/ 29 июня 2010

Поскольку чтение части потока должно быть достаточно простым, я предполагаю, что вам на самом деле нужен новый объект Stream, который обращается только к данному сегменту базового потока.

т.е.Вы хотите что-то вроде этого:

Stream segment = new StreamSegment(underlyingStream, 8000, 7000);

У меня есть такой класс, и вы можете найти его здесь: LVK.IO.PartialStream .Он опирается на другие классы из моей библиотеки классов, в частности LVK.IO.WrapperStream , но вы можете найти все это там, просто возьмите несколько файлов, которые вам действительно нужны (если вы решите их использовать).

Чтобы использовать его, вы должны указать, принадлежит ли ваш объект PartialStream базовому потоку.Если это так, то при удалении объекта PartialStream он также удаляет базовый поток.

Так что для приведенного выше примера:

Stream segment = new PartialStream(underlyingStream, false, 8000, 7000);

при условии, что он не должен владеть базовым потоком.stream (или передайте true в качестве второго параметра.)

Примечания:

  • Построение вышеупомянутого объекта PartialStream переместит базовый поток в начало этого сегмента (позиция 8000 ввышеприведенный пример.)
  • Вы не должны использовать базовый поток, пока вы используете объект частичного потока, поскольку происходит некоторая внутренняя бухгалтерия, связанная с позицией внутри сегмента.Если вы перемещаете основной поток, не проходя через частичный поток, поведение не определено.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...