public function stream_read($count)
    {
        if (!$this->_objectName) {
            return '';
        }

        // make sure that count doesn't exceed object size
        if ($count + $this->_position > $this->_objectSize) {
            $count = $this->_objectSize - $this->_position;
        }

        $range_start = $this->_position;
        $range_end = $this->_position + $count -1;

        // Only fetch more data from OSS if we haven't fetched any data yet (postion=0)
        // OR, the range end position is greater than the size of the current object
        // buffer AND if the range end position is less than or equal to the object's
        // size returned by OSS
        if (($this->_position == 0) || (($range_end > strlen($this->_objectBuffer)) && ($range_end <= $this->_objectSize))) {
            $options = [
                OssClient::OSS_RANGE => $range_start.'-'.$range_end,
            ];
            $this->_objectBuffer .= $this->_oss->getObject(AliyunOSS::getBucket(), $this->_objectName, $options);
        }

        $data = substr($this->_objectBuffer, $this->_position, $count);
        $this->_position += strlen($data);

        return $data;
    }