MCPcopy Create free account
hub / github.com/RT-Thread/env-windows / BufferedWriter

Class BufferedWriter

tools/python-3.11.9-amd64/Lib/_pyio.py:1240–1342  ·  view source on GitHub ↗

A buffer for a writeable sequential RawIO object. The constructor creates a BufferedWriter for the given writeable raw stream. If the buffer_size is not given, it defaults to DEFAULT_BUFFER_SIZE.

Source from the content-addressed store, hash-verified

1238 return pos
1239
1240class BufferedWriter(_BufferedIOMixin):
1241
1242 """A buffer for a writeable sequential RawIO object.
1243
1244 The constructor creates a BufferedWriter for the given writeable raw
1245 stream. If the buffer_size is not given, it defaults to
1246 DEFAULT_BUFFER_SIZE.
1247 """
1248
1249 def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE):
1250 if not raw.writable():
1251 raise OSError('"raw" argument must be writable.')
1252
1253 _BufferedIOMixin.__init__(self, raw)
1254 if buffer_size <= 0:
1255 raise ValueError("invalid buffer size")
1256 self.buffer_size = buffer_size
1257 self._write_buf = bytearray()
1258 self._write_lock = Lock()
1259
1260 def writable(self):
1261 return self.raw.writable()
1262
1263 def write(self, b):
1264 if isinstance(b, str):
1265 raise TypeError("can't write str to binary stream")
1266 with self._write_lock:
1267 if self.closed:
1268 raise ValueError("write to closed file")
1269 # XXX we can implement some more tricks to try and avoid
1270 # partial writes
1271 if len(self._write_buf) > self.buffer_size:
1272 # We're full, so let's pre-flush the buffer. (This may
1273 # raise BlockingIOError with characters_written == 0.)
1274 self._flush_unlocked()
1275 before = len(self._write_buf)
1276 self._write_buf.extend(b)
1277 written = len(self._write_buf) - before
1278 if len(self._write_buf) > self.buffer_size:
1279 try:
1280 self._flush_unlocked()
1281 except BlockingIOError as e:
1282 if len(self._write_buf) > self.buffer_size:
1283 # We've hit the buffer_size. We have to accept a partial
1284 # write and cut back our buffer.
1285 overage = len(self._write_buf) - self.buffer_size
1286 written -= overage
1287 self._write_buf = self._write_buf[:self.buffer_size]
1288 raise BlockingIOError(e.errno, e.strerror, written)
1289 return written
1290
1291 def truncate(self, pos=None):
1292 with self._write_lock:
1293 self._flush_unlocked()
1294 if pos is None:
1295 pos = self.raw.tell()
1296 return self.raw.truncate(pos)
1297

Callers 2

openFunction · 0.70
__init__Method · 0.70

Calls

no outgoing calls

Tested by

no test coverage detected