| Index: sdk/lib/io/file_impl.dart | 
| diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart | 
| index 15fbded0b3e2c4d7e876ec0243a07a9c534dfdbb..2057234ac7af8da9ca6804232adac3834fb75a92 100644 | 
| --- a/sdk/lib/io/file_impl.dart | 
| +++ b/sdk/lib/io/file_impl.dart | 
| @@ -16,6 +16,7 @@ class _FileStream extends Stream<List<int>> { | 
| String _path; | 
| RandomAccessFile _openedFile; | 
| int _position; | 
| +  int _end; | 
|  | 
| // Has the stream been paused or unsubscribed? | 
| bool _paused = false; | 
| @@ -27,7 +28,7 @@ class _FileStream extends Stream<List<int>> { | 
| // Block read but not yet send because stream is paused. | 
| List<int> _currentBlock; | 
|  | 
| -  _FileStream(String this._path) : _position = 0 { | 
| +  _FileStream(String this._path, this._position, this._end) { | 
| _setupController(); | 
| } | 
|  | 
| @@ -71,7 +72,14 @@ class _FileStream extends Stream<List<int>> { | 
| // Don't start a new read if one is already in progress. | 
| if (_readInProgress) return; | 
| _readInProgress = true; | 
| -    _openedFile.read(_BLOCK_SIZE) | 
| +    int readBytes = _BLOCK_SIZE; | 
| +    if (_end != null) { | 
| +      readBytes = min(readBytes, _end - _position); | 
| +      if (readBytes < 0) { | 
| +        throw new RangeError("Bad end position: $_end"); | 
| +      } | 
| +    } | 
| +    _openedFile.read(readBytes) | 
| .then((block) { | 
| _readInProgress = false; | 
| if (block.length == 0) { | 
| @@ -108,8 +116,16 @@ class _FileStream extends Stream<List<int>> { | 
| openFuture | 
| .then((RandomAccessFile opened) { | 
| _openedFile = opened; | 
| -        _readBlock(); | 
| +        if (_position == null) { | 
| +          _position = 0; | 
| +        } | 
| +        if (_position > 0) { | 
| +          return opened.setPosition(_position); | 
| +        } else if (_position < 0) { | 
| +          throw new RangeError("Bad start position: $_position"); | 
| +        } | 
| }) | 
| +      .then((_) => _readBlock()) | 
| .catchError((e) { | 
| _controller.addError(e); | 
| _controller.close(); | 
| @@ -430,8 +446,8 @@ class _File implements File { | 
| return result; | 
| } | 
|  | 
| -  Stream<List<int>> openRead() { | 
| -    return new _FileStream(_path); | 
| +  Stream<List<int>> openRead([int start, int end]) { | 
| +    return new _FileStream(_path, start, end); | 
| } | 
|  | 
| IOSink openWrite({FileMode mode: FileMode.WRITE, | 
|  |