2013-12-26 3 views
1

i`m writnig Приложение для хранения окон C#, я получаю данные через сокеты. Я хочу знать, есть ли какой-либо C# -валютный метод для java DataInptStream.ReadFully(). Как написано здесь http://www.tutorialspoint.com/java/io/datainputstream_readfully.htmC#, java DataInputStream.readFully() эквивалент

метод считывает байт из входного потока и выделяет те, в буферного массива б.

Он блокируется до тех пор, пока не произойдет одно из следующих условий: Доступны b.1 длины байтов входных данных. Есть ли эквивалентный метод в C#? Это будет ждать, пока длина байтов не будет доступна?

ответ

4

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

BinaryReader.ReadBytes (предложенный No One) не ведет себя так:

байтовый массив, содержащий данные, считанные из основного потока. Этот может быть меньше количества запрошенных байтов, если достигнут конец потока .

Насколько я знаю, нет никакого другого способа с эквивалентным поведением, но вы можете создать его с extension method:

public static void ReadFully(this Stream stream, byte[] buffer) 
{ 
    int offset = 0; 
    int readBytes; 
    do 
    { 
     // If you are using Socket directly instead of a Stream: 
     //readBytes = socket.Receive(buffer, offset, buffer.Length - offset, 
     //       SocketFlags.None); 

     readBytes = stream.Read(buffer, offset, buffer.Length - offset); 
     offset += readBytes; 
    } while (readBytes > 0 && offset < buffer.Length); 

    if (offset < buffer.Length) 
    { 
     throw new EndOfStreamException(); 
    } 
} 

Вы можете использовать этот метод расширения, как если бы она была частью класс Stream, если вы импортировали пространство имен, оно определено в:

byte[] buffer = new byte[8192]; 
myNetworkStream.ReadFully(buffer); 
Смежные вопросы