BufferedReader(raw[, buffer_size]) A buffer for a readable, sequential BaseRawIO object. The constructor creates a BufferedReader for the given readable raw stream and buffer_size. If buffer_size is omitted, DEFAULT_BUFFER_SIZE is used.
| 1032 | |
| 1033 | |
| 1034 | class BufferedReader(_BufferedIOMixin): |
| 1035 | |
| 1036 | """BufferedReader(raw[, buffer_size]) |
| 1037 | |
| 1038 | A buffer for a readable, sequential BaseRawIO object. |
| 1039 | |
| 1040 | The constructor creates a BufferedReader for the given readable raw |
| 1041 | stream and buffer_size. If buffer_size is omitted, DEFAULT_BUFFER_SIZE |
| 1042 | is used. |
| 1043 | """ |
| 1044 | |
| 1045 | def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE): |
| 1046 | """Create a new buffered reader using the given readable raw IO object. |
| 1047 | """ |
| 1048 | if not raw.readable(): |
| 1049 | raise OSError('"raw" argument must be readable.') |
| 1050 | |
| 1051 | _BufferedIOMixin.__init__(self, raw) |
| 1052 | if buffer_size <= 0: |
| 1053 | raise ValueError("invalid buffer size") |
| 1054 | self.buffer_size = buffer_size |
| 1055 | self._reset_read_buf() |
| 1056 | self._read_lock = Lock() |
| 1057 | |
| 1058 | def readable(self): |
| 1059 | return self.raw.readable() |
| 1060 | |
| 1061 | def _reset_read_buf(self): |
| 1062 | self._read_buf = b"" |
| 1063 | self._read_pos = 0 |
| 1064 | |
| 1065 | def read(self, size=None): |
| 1066 | """Read size bytes. |
| 1067 | |
| 1068 | Returns exactly size bytes of data unless the underlying raw IO |
| 1069 | stream reaches EOF or if the call would block in non-blocking |
| 1070 | mode. If size is negative, read until EOF or until read() would |
| 1071 | block. |
| 1072 | """ |
| 1073 | if size is not None and size < -1: |
| 1074 | raise ValueError("invalid number of bytes to read") |
| 1075 | with self._read_lock: |
| 1076 | return self._read_unlocked(size) |
| 1077 | |
| 1078 | def _read_unlocked(self, n=None): |
| 1079 | nodata_val = b"" |
| 1080 | empty_values = (b"", None) |
| 1081 | buf = self._read_buf |
| 1082 | pos = self._read_pos |
| 1083 | |
| 1084 | # Special case for when the number of bytes to read is unspecified. |
| 1085 | if n is None or n == -1: |
| 1086 | self._reset_read_buf() |
| 1087 | if hasattr(self.raw, 'readall'): |
| 1088 | chunk = self.raw.readall() |
| 1089 | if chunk is None: |
| 1090 | return buf[pos:] or None |
| 1091 | else: |