Buffered Stream. Read Метод
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Перегрузки
Копирует байты из текущего буферизованного потока в диапазон байтов и перемещает позицию в буферизованном потоке вперед на количество прочитанных байтов.
Копирует байты из текущего буферизованного потока в массив.
Read(Span)
Копирует байты из текущего буферизованного потока в диапазон байтов и перемещает позицию в буферизованном потоке вперед на количество прочитанных байтов.
public: override int Read(Span destination);
public override int Read (Span destination);
override this.Read : Span -> int
Public Overrides Function Read (destination As Span(Of Byte)) As Integer
Параметры
destination Span
Область памяти. При возвращении данного метода содержимое этой области заменяется байтами, считанными из текущего источника.
Возвращаемое значение
Общее количество байтов, считанных в буфер. Это число может быть меньше количества выделенных в буфере байтов, если столько байтов в настоящее время недоступно, а также равняться нулю (0), если был достигнут конец потока.
Комментарии
Используйте свойство , CanRead чтобы определить, поддерживает ли текущий экземпляр чтение. Используйте метод для ReadAsync асинхронного чтения из текущего потока.
Реализации этого метода считывают максимум buffer.Length байтов из текущего потока и сохраняют их в buffer . Текущая позиция в потоке расширена по количеству прочитанных байтов; Однако если возникает исключение, текущая позиция в потоке остается неизменной. Реализации возвращают количество прочитанных байтов. Реализация будет блокироваться до тех пор, пока не будет прочитано хотя бы один байт данных, если данные не будут доступны. Read возвращает значение 0, только если в потоке больше нет данных и больше не ожидается (например, закрытый сокет или конец файла). Реализация может возвращать меньше байтов, чем запрошено, даже если конец потока не достигнут.
Используется BinaryReader для чтения примитивных типов данных.
Применяется к
Read(Byte[], Int32, Int32)
Копирует байты из текущего буферизованного потока в массив.
public: override int Read(cli::array ^ array, int offset, int count);
public: override int Read(cli::array ^ buffer, int offset, int count);
public override int Read (byte[] array, int offset, int count);
public override int Read (byte[] buffer, int offset, int count);
override this.Read : byte[] * int * int -> int
override this.Read : byte[] * int * int -> int
Public Overrides Function Read (array As Byte(), offset As Integer, count As Integer) As Integer
Public Overrides Function Read (buffer As Byte(), offset As Integer, count As Integer) As Integer
Параметры
array buffer Byte[]
Буфер, в который необходимо скопировать байты.
Смещение в буфере (в байтах), с которого начинается чтение байтов.
Количество байтов, чтение которых необходимо выполнить.
Возвращаемое значение
Общее число байтов, считанных в array . Это число может быть меньше, чем количество запрошенных байтов, если столько байтов в настоящее время недоступно, или равняться нулю, если конец файла был достигнут раньше, чем были считаны данные.
Исключения
Длина array минус offset меньше count .
array имеет значение null .
offset или count является отрицательным значением.
Поток не открыт или его значение равно null .
Поток не поддерживает чтение.
Методы были вызваны после закрытия потока.
Примеры
Этот пример входит в состав более крупного примера использования класса BufferedStream.
// Receive data using the BufferedStream. Console::WriteLine( "Receiving data using BufferedStream." ); bytesReceived = 0; startTime = DateTime::Now; while ( bytesReceived < numberOfLoops * receivedData->Length ) < bytesReceived += bufStream->Read( receivedData, 0, receivedData->Length ); > bufferedTime = (DateTime::Now - startTime).TotalSeconds; Console::WriteLine( " bytes received in seconds.\n", bytesReceived.ToString(), bufferedTime.ToString( "F1" ) );
// Receive data using the BufferedStream. Console.WriteLine("Receiving data using BufferedStream."); bytesReceived = 0; startTime = DateTime.Now; int numBytesToRead = receivedData.Length; while (numBytesToRead > 0) < // Read may return anything from 0 to numBytesToRead. int n = bufStream.Read(receivedData,0, receivedData.Length); // The end of the file is reached. if (n == 0) break; bytesReceived += n; numBytesToRead -= n; >bufferedTime = (DateTime.Now - startTime).TotalSeconds; Console.WriteLine(" bytes received in seconds.\n", bytesReceived.ToString(), bufferedTime.ToString("F1"));
// Receive data using the BufferedStream. printfn "Receiving data using BufferedStream." bytesReceived 0 do // Read may return anything from 0 to numBytesToRead. let n = bufStream.Read(receivedData,0, receivedData.Length) // The end of the file is reached. if n = 0 then broken bytes received in seconds.\n"
' Receive data using the BufferedStream. Console.WriteLine("Receiving data using BufferedStream.") bytesReceived = 0 startTime = DateTime.Now Dim numBytesToRead As Integer = receivedData.Length Dim n As Integer Do While numBytesToRead > 0 'Read my return anything from 0 to numBytesToRead n = bufStream.Read(receivedData, 0, receivedData.Length) 'The end of the file is reached. If n = 0 Then Exit Do End If bytesReceived += n numBytesToRead -= n Loop bufferedTime = DateTime.Now.Subtract(startTime).TotalSeconds Console.WriteLine(" bytes received in " & _ "seconds." & vbCrLf, _ bytesReceived.ToString(), _ bufferedTime.ToString("F1"))
Комментарии
Метод Read возвращает значение 0, только если достигнут конец потока. Во всех остальных случаях Read всегда считывает по крайней мере один байт из потока перед возвратом. По определению, если данные из потока не доступны при вызове Read метода , Read метод возвращает значение 0 (конец потока достигается автоматически). Реализация может возвращать меньше байтов, чем запрошено, даже если конец потока не достигнут.
Используется BinaryReader для чтения примитивных типов данных.
См. также раздел
- BlockCopy(Array, Int32, Array, Int32, Int32)
- CanRead
- Write(Byte[], Int32, Int32)
- Файловый и потоковый ввод-вывод
- Практическое руководство. Чтение текста из файла
- Практическое руководство. Запись текста в файл
Как именно работает метод read() у InputStream?
В консоль выводится 253, а не -3.
Почему так происходит?
Тип данных int в Java является дополненнным до двух целым числом и использует 32 бита вместо 8.
В 32х битном виде число 253 будет:
00000000000000000000000011111101
т. е. метод read() возвращает не само значение byte, а его представление в 32х битном виде.
Как хранятся значения в int в byte
| число | 32 bit | 8 bit | ----- -------------------------------- -------- | . . | . . . . . . . . . . . . . . . . | | . . | . . . . . . . . . . . . . . . . | | -128 | 11111111111111111111111110000000 | 10000000 | | -127 | 11111111111111111111111110000001 | 10000001 | | -126 | 11111111111111111111111110000010 | 10000010 | | -125 | 11111111111111111111111110000011 | 10000011 | | . . | . . . . . . . . . . . . . . . . | . . . . | | . . | . . . . . . . . . . . . . . . . | . . . . | | -2 | 11111111111111111111111111111110 | 11111110 | | -1 | 11111111111111111111111111111111 | 11111111 | | 0 | 00000000000000000000000000000000 | 00000000 | | 1 | 00000000000000000000000000000001 | 00000001 | | 2 | 00000000000000000000000000000010 | 00000010 | | . . | . . . . . . . . . . . . . . . . | . . . . | | . . | . . . . . . . . . . . . . . . . | . . . . | | 125 | 00000000000000000000000001111101 | 01111101 | | 126 | 00000000000000000000000001111110 | 01111110 | | 127 | 00000000000000000000000001111111 | 01111111 | | . . | . . . . . . . . . . . . . . . . | | . . | . . . . . . . . . . . . . . . . |
Диапазон byte в Java лежит от -128 до 127, а возвращаемое значение метода read() лежит в диапазоне от 0 до 255.
Что происходит с числом byte в методе read
Чтобы получить представление byte в int в методе read() используется побитовое «И» c числом 255, т. е. убираем лидирующие единицы.
| число | 32 bit | ----- -------------------------------- | -3 | 11111111111111111111111111111101 | И | 255 | 00000000000000000000000011111111 | = | 253 | 00000000000000000000000011111101 |
Чтобы из представления получить обратно значение byte в int, нужно выполнить обратную операцию побитовое «ИЛИ» c числом -256, т. е. добавляем лидирующие единицы.
| число | 32 bit | ----- -------------------------------- | 253 | 00000000000000000000000011111101 | ИЛИ | -256 | 11111111111111111111111100000000 | = | -3 | 11111111111111111111111111111101 |
Что происходит с числом byte == -1 в методе read()
То же самое: убираем лидирующие единицы.
| число | 32 bit | ----- -------------------------------- | -1 | 11111111111111111111111111111111 | И | 255 | 00000000000000000000000011111111 | = | 255 | 00000000000000000000000011111111 |
Отслеживать
ответ дан 16 июл 2019 в 11:11
user236980 user236980
Спасибо, классные ответы, но я несовсем разобрался. что будет если read прочтет -1 из потока? Он сделает побитовое И с 255, потом обратно ИЛИ с -256? Что в итоге? Получается int-овое представление будет совершенно другим? Как получить значение -1?
16 июл 2019 в 16:22
Если в методе read встречается byte со значением -1 то он вернет 255? В чем секрет? Как с этим работать?)
22 июл 2019 в 5:06
На все 4 вопроса вообще один ответ. Возвращается int потому что надо такой тип, который может вместить в себя один байт (реальные данные) плюс одно служебное значение (это тот самый -1 ), которое является признаком окончания чтения.
Вообще конечно можно бы было спроектировать метод read() так, чтобы он возвращал byte . Но тогда этот метод в случае окончания потока либо должен был бросать исключение, либо вводить допольнительный метод, при помощи которого бы можно было проверять окончание потока. С обоими способами бы были проблемы, т.к. с исключениями у программистов всегда бы оно ловилось, а природа исключений немного другая. А с дополнительным методом нельзя заставить обязать программиста его везде вызывать (ведь если этот вызов будет опущен, то как отделить, когда из потока методом read возращается 0 с данными от 0 когда данных нет.
Вообще говоря, этот метод редко используется, в основном из-за своих проблем с производительностью. Предпочтение отдаётся методу read(byte[]), который читает сразу массив байт.
P.S. Другой вопрос почему тут выбрали int , а не short . Точных причин сказать не могу, но скорее потому, что short считается неполноценным братом int . Многие арифметические алгоритмы предпочитают использовать всегда int , даже когда точно известно, что диапазона short вполне хватит. И ещё есть момент с short . JVM-инструкции более заточены на int , нежели на short .
Oracle Lob. Read(Byte[], Int32, Int32) Метод
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Считывает последовательность байтов из текущего потока OracleLob и перемещает позицию внутри потока на число считанных байтов.
public: override int Read(cli::array ^ buffer, int offset, int count);
public override int Read (byte[] buffer, int offset, int count);
override this.Read : byte[] * int * int -> int
Public Overrides Function Read (buffer As Byte(), offset As Integer, count As Integer) As Integer
Параметры
Массив байтов. При возвращении данного метода буфер содержит указанный массив байтов, в котором значения между offset и ( offset + count ) заменены байтами, считанными из текущего источника.
Смещение байтов (начиная с нуля) в buffer , с которого начинается сохранение данных, считанных из текущего потока. Для типов данных CLOB и NCLOB это число должно быть четным.
Максимальное количество байтов, которое должно быть считано из текущего потока. Для типов данных CLOB и NCLOB это число должно быть четным.
Возвращаемое значение
Общее количество байтов, считанных в буфер. Это число может быть меньше количества запрошенных байтов, если столько байтов в настоящее время недоступно, а также равняться нулю (0), если был достигнут конец потока.
Исключения
buffer является пустой ссылкой ( Nothing в Visual Basic).
Значение параметров offset или count не является положительным.
Сумма параметров смещения и счетчика превышает длину буфера.
Значение, заданное для параметра amount или offset , меньше нуля или больше 4 гигабайт.
Операция выполняется не в рамках транзакции, объект OracleLob является пустым, или же закрыто подключение.
Объект был закрыт или уничтожен.
Произошла ошибка Oracle.
Комментарии
Метод Read считывает максимум count байтов из текущего потока и сохраняет их в buffer , начиная с offset . Текущая позиция в потоке расширена по количеству прочитанных байтов; Однако если возникает исключение, текущая позиция в потоке остается неизменной. Read возвращает число прочитанных байтов. Возвращаемое значение равно нулю, только если позиция в данный момент находится в конце потока. Read будет блокироваться до тех пор, пока не будет прочитан хотя бы один байт данных, если данные недоступны.Read возвращает значение 0 при попытке считывания из , LOB если текущая позиция находится в конце LOB . Read может возвращать меньше байтов, чем запрошено, даже если не достигнут конец потока.
Поставщик данных платформа .NET Framework для Oracle обрабатывает все CLOB данные и NCLOB в формате Юникода. Таким образом, при доступе CLOB к типам данных и NCLOB вы всегда имеете дело с количеством байтов, где каждый символ равен 2 байта. Например, если строка текста, содержащая три символа, сохраняется как на сервере NCLOB Oracle, где набор символов составляет 4 байта на символ, и выполняется Read операция, вы указываете длину строки в виде 6 байт, хотя она хранится в виде 12 байт на сервере.
В следующем примере показано, как считывать OracleLob объекты.
public static void ReadLobExample(OracleCommand command) < int actual = 0; // Select some data. // Table Schema: // "CREATE TABLE TableWithLobs (a int, b BLOB, c CLOB, d NCLOB)"; // "INSERT INTO TableWithLobs values (1, 'AA', 'AAA', N'AAAA')"; command.CommandText = "SELECT * FROM TableWithLobs"; OracleDataReader reader = command.ExecuteReader(); using(reader) < // Obtain the first row of data. reader.Read(); // Obtain the LOBs (all 3 varieties). OracleLob BLOB = reader.GetOracleLob(1); OracleLob CLOB = reader.GetOracleLob(2); OracleLob NCLOB = reader.GetOracleLob(3); // Example - Reading binary data (in chunks). var buffer = new byte[100]; while((actual = BLOB.Read(buffer, 0, buffer.Length)) >0) Console.WriteLine(BLOB.LobType + ".Read(" + buffer + ", " + buffer.Length + ") => " + actual); // Example - Reading CLOB/NCLOB data (in chunks). // Note: You can read character data as raw Unicode bytes (using OracleLob.Read as in the above example). // However, because the OracleLob object inherits directly from the.NET stream object, // all the existing classes that manipulate streams can also be used. For example, the // .NET StreamReader makes converting the raw bytes into actual characters easier. var streamreader = new StreamReader(CLOB, Encoding.Unicode); var cbuffer = new char[100]; while((actual = streamreader.Read(cbuffer, 0, cbuffer.Length)) >0) Console.WriteLine(CLOB.LobType + ".Read(" + new string(cbuffer, 0, actual) + ", " + cbuffer.Length + ") => " + actual); //Example - Reading data (all at once). //You could use StreamReader.ReadToEnd to obtain all the string data,or simply //call OracleLob.Value to obtain a contiguous allocation of all the data. Console.WriteLine(NCLOB.LobType + ".Value => " + NCLOB.Value); > >
Вы можете создать объект, OracleLob имеющий значение NULL, в следующем формате:
OracleLob myLob = OracleLob.Null;
Этот метод используется в основном для проверки того, имеет ли LOB возвращаемый с сервера объект NULL, как показано в следующем примере.
if (myLob == OracleLob.Null)
Значение NULL LOB ведет себя аналогично нулевому байту LOB в , что Read выполняется успешно и всегда возвращает ноль байтов.
Как работает метод read java
Метод read() является частью класса InputStream , который является абстрактным классом для чтения последовательности байтов. Этот метод используется для чтения одного байта из потока ввода.
Синтаксис метода read() выглядит следующим образом:
public abstract int read() throws IOException
Метод возвращает целое число int , которое представляет следующий байт в потоке. Если достигнут конец потока, то возвращается значение -1.
Пример использования метода read() :
try // Создание объекта FileInputStream для чтения файла FileInputStream fis = new FileInputStream("example.txt"); // Чтение первого байта из файла int byteRead = fis.read(); // Пока не достигнут конец файла while (byteRead != -1) // Обработка текущего байта System.out.print((char) byteRead); // Чтение следующего байта из файла byteRead = fis.read(); > // Закрытие потока ввода fis.close(); > catch (IOException e) e.printStackTrace(); >
- создается объект FileInputStream , который открывает файл «example.txt» для чтения.
- с помощью метода read() читается каждый байт из файла, пока не будет достигнут конец файла (-1)
- прочитанные байты выводятся на экран в виде символов с помощью char
- после окончания чтения файла, поток ввода закрывается методом close()
Важно отметить, что метод read() может выбрасывать исключение IOException , которое должно быть обработано с помощью блока try-catch или перенесено на уровень вызывающего кода с помощью оператора throws