A buffered interface to random access streams. The constructor creates a reader and writer for a seekable stream, raw, given in the first argument. If the buffer_size is omitted it defaults to DEFAULT_BUFFER_SIZE.
| 1410 | |
| 1411 | |
| 1412 | class BufferedRandom(BufferedWriter, BufferedReader): |
| 1413 | |
| 1414 | """A buffered interface to random access streams. |
| 1415 | |
| 1416 | The constructor creates a reader and writer for a seekable stream, |
| 1417 | raw, given in the first argument. If the buffer_size is omitted it |
| 1418 | defaults to DEFAULT_BUFFER_SIZE. |
| 1419 | """ |
| 1420 | |
| 1421 | def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE): |
| 1422 | raw._checkSeekable() |
| 1423 | BufferedReader.__init__(self, raw, buffer_size) |
| 1424 | BufferedWriter.__init__(self, raw, buffer_size) |
| 1425 | |
| 1426 | def seek(self, pos, whence=0): |
| 1427 | if whence not in valid_seek_flags: |
| 1428 | raise ValueError("invalid whence value") |
| 1429 | self.flush() |
| 1430 | if self._read_buf: |
| 1431 | # Undo read ahead. |
| 1432 | with self._read_lock: |
| 1433 | self.raw.seek(self._read_pos - len(self._read_buf), 1) |
| 1434 | # First do the raw seek, then empty the read buffer, so that |
| 1435 | # if the raw seek fails, we don't lose buffered data forever. |
| 1436 | pos = self.raw.seek(pos, whence) |
| 1437 | with self._read_lock: |
| 1438 | self._reset_read_buf() |
| 1439 | if pos < 0: |
| 1440 | raise OSError("seek() returned invalid position") |
| 1441 | return pos |
| 1442 | |
| 1443 | def tell(self): |
| 1444 | if self._write_buf: |
| 1445 | return BufferedWriter.tell(self) |
| 1446 | else: |
| 1447 | return BufferedReader.tell(self) |
| 1448 | |
| 1449 | def truncate(self, pos=None): |
| 1450 | if pos is None: |
| 1451 | pos = self.tell() |
| 1452 | # Use seek to flush the read buffer. |
| 1453 | return BufferedWriter.truncate(self, pos) |
| 1454 | |
| 1455 | def read(self, size=None): |
| 1456 | if size is None: |
| 1457 | size = -1 |
| 1458 | self.flush() |
| 1459 | return BufferedReader.read(self, size) |
| 1460 | |
| 1461 | def readinto(self, b): |
| 1462 | self.flush() |
| 1463 | return BufferedReader.readinto(self, b) |
| 1464 | |
| 1465 | def peek(self, size=0): |
| 1466 | self.flush() |
| 1467 | return BufferedReader.peek(self, size) |
| 1468 | |
| 1469 | def read1(self, size=-1): |
no outgoing calls
no test coverage detected
searching dependent graphs…