Go to the documentation of this file.00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00015 final class FileInputStream extends InputStream
00016 {
00017 private $fd = null;
00018
00019 private $mark = null;
00020
00021 public function __construct($nameOrFd)
00022 {
00023 if (is_resource($nameOrFd)) {
00024 if (get_resource_type($nameOrFd) !== 'stream')
00025 throw new IOException('not a file resource');
00026
00027 $this->fd = $nameOrFd;
00028
00029 } else {
00030 try {
00031 $this->fd = fopen($nameOrFd, 'rb');
00032 } catch (BaseException $e) {
00033 throw new IOException($e->getMessage());
00034 }
00035 }
00036 }
00037
00038 public function __destruct()
00039 {
00040 try {
00041 $this->close();
00042 } catch (BaseException $e) {
00043
00044 }
00045 }
00046
00050 public static function create($nameOrFd)
00051 {
00052 return new self($nameOrFd);
00053 }
00054
00055 public function isEof()
00056 {
00057 return feof($this->fd);
00058 }
00059
00063 public function mark()
00064 {
00065 $this->mark = $this->getOffset();
00066
00067 return $this;
00068 }
00069
00070 public function getOffset()
00071 {
00072 return ftell($this->fd);
00073 }
00074
00075 public function markSupported()
00076 {
00077 return true;
00078 }
00079
00083 public function reset()
00084 {
00085 return $this->seek($this->mark);
00086 }
00087
00091 public function seek($offset)
00092 {
00093 if (fseek($this->fd, $offset) < 0)
00094 throw new IOException(
00095 'mark has been invalidated'
00096 );
00097
00098 return $this;
00099 }
00100
00104 public function close()
00105 {
00106 if (!fclose($this->fd))
00107 throw new IOException('failed to close the file');
00108
00109 return $this;
00110 }
00111
00112 public function read($length)
00113 {
00114 return $this->realRead($length);
00115 }
00116
00117 public function readString($length = null)
00118 {
00119 return $this->realRead($length, true);
00120 }
00121
00122 public function realRead($length, $string = false)
00123 {
00124 $result = $string
00125 ? (
00126 $length === null
00127 ? fgets($this->fd)
00128 : fgets($this->fd, $length)
00129 )
00130 : fread($this->fd, $length);
00131
00132 if ($string && $result === false && feof($this->fd))
00133 $result = null;
00134
00135 if ($result === false)
00136 throw new IOException('failed to read from file');
00137
00138 if ($result === '')
00139 $result = null;
00140
00141 return $result;
00142 }
00143 }
00144 ?>