docs: function FileBufferStream(options) {
  	if (!options) options = {};
  
  	// Always data mode
  	options.objectMode = false;
  	options.allowHalfOpen = true;
  
  	Duplex.call(this, options);
  	this._fileBufferState = {
  		writeFd: null,				// FD writing to the file
  		waitingForWriteOpen: null,	// Function to call when the writing open() returns
  		readFd: null,				// FD reading from the file
  		waitingForRead: false,		// True if push() returned false and we're waiting for _read() to be called again
  		readBufferSize: 16 * 1024,	// Size of file read buffer
  		totalWritten: 0,
  		totalRead: 0,
  		writeEof: false, 			// If the writable side of this stream has EOF'd
  		options: options
  	};
  	var self = this;
  
  	// Generate a temp filename if not given
  	if (!options.filename) {
  		options.filename = '/tmp/zstreams-' + Math.floor(Math.random() * 10000) + Math.floor(Math.random() * 10000);
  	}
  
  	// Default to removing temp file
  	if (options.removeFile === undefined) {
  		options.removeFile = true;
  	}
  
  	// Open the file for writing
  	fs.open(options.filename, 'w', function(err, fd) {
  		if (err) return self.emit(err);
  		self._fileBufferState.writeFd = fd;
  		if (self._fileBufferState.waitingForWriteOpen) {
  			self._fileBufferState.waitingForWriteOpen();
  			self._fileBufferState.waitingForWriteOpen = null;
  		}
  	});
  }