72 lines
1.5 KiB
PHP
72 lines
1.5 KiB
PHP
|
<?php
|
||
|
namespace nur\b\io;
|
||
|
|
||
|
/**
|
||
|
* Class FileWriter: écriture dans un flux
|
||
|
*/
|
||
|
class StreamWriter implements IWriter {
|
||
|
use Twriter, Tfilter;
|
||
|
|
||
|
/** @var resource */
|
||
|
protected $fd;
|
||
|
|
||
|
/** @var bool */
|
||
|
protected $close;
|
||
|
|
||
|
/** @throws IOException */
|
||
|
function __construct($fd, ?bool $close=null) {
|
||
|
if ($close === null) $close = $fd !== null;
|
||
|
if ($fd === null) $fd = STDOUT;
|
||
|
$this->fd = $fd;
|
||
|
$this->close = $close;
|
||
|
}
|
||
|
|
||
|
function setEncodingFilter(string $to, string $from="utf-8"): void {
|
||
|
$this->_setEncodingFilter($from, $to);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @throws IOException
|
||
|
* @return resource
|
||
|
*/
|
||
|
protected final function open() {
|
||
|
IOException::ensure_open($this->fd === null);
|
||
|
$this->_streamAppendFilters($this->fd);
|
||
|
return $this->fd;
|
||
|
}
|
||
|
|
||
|
/** @throws IOException */
|
||
|
function getResource() {
|
||
|
return $this->open();
|
||
|
}
|
||
|
|
||
|
/** @throws IOException */
|
||
|
function seek(int $offset=0, int $whence=SEEK_SET): int {
|
||
|
return fseek($this->open(), $offset, $whence);
|
||
|
}
|
||
|
|
||
|
/** @throws IOException */
|
||
|
function _write(string $value): void {
|
||
|
IOException::ensure_not_false(fwrite($this->open(), $value), "write");
|
||
|
}
|
||
|
|
||
|
function putContents(string $contents): void {
|
||
|
try {
|
||
|
$this->_write($contents);
|
||
|
} finally {
|
||
|
$this->close();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function serialize($object): void {
|
||
|
$this->putContents(serialize($object));
|
||
|
}
|
||
|
|
||
|
function close(bool $close=true): void {
|
||
|
if ($this->fd !== null && $this->close && $close) {
|
||
|
fclose($this->fd);
|
||
|
$this->fd = null;
|
||
|
}
|
||
|
}
|
||
|
}
|