| Index: sdk/lib/io/io_sink.dart
 | 
| diff --git a/sdk/lib/io/io_sink.dart b/sdk/lib/io/io_sink.dart
 | 
| index 042a469fb67c770216b9d1c07def35d8e9e2e02d..45390d88375c6552ce068286a2ea0e0d5bd8e2c6 100644
 | 
| --- a/sdk/lib/io/io_sink.dart
 | 
| +++ b/sdk/lib/io/io_sink.dart
 | 
| @@ -46,6 +46,17 @@ abstract class IOSink implements StreamSink<List<int>>, StringSink {
 | 
|    Future addStream(Stream<List<int>> stream);
 | 
|  
 | 
|    /**
 | 
| +   * Returns a [Future] that completes once all buffered data is accepted by the
 | 
| +   * to underlying [StreamConsumer].
 | 
| +   *
 | 
| +   * It's an error to call this method, while an [addStream] is incomplete.
 | 
| +   *
 | 
| +   * NOTE: This is not necessarily the same as the data being flushed by the
 | 
| +   * operating system.
 | 
| +   */
 | 
| +  Future flush();
 | 
| +
 | 
| +  /**
 | 
|     * Close the target.
 | 
|     */
 | 
|    Future close();
 | 
| @@ -99,6 +110,13 @@ class _StreamSinkImpl<T> implements StreamSink<T> {
 | 
|      return future.then((_) => targetAddStream());
 | 
|    }
 | 
|  
 | 
| +  Future flush() {
 | 
| +    // Adding an empty stream-controller will return a future that will complete
 | 
| +    // when all data is done.
 | 
| +    var controller = new StreamController()..close();
 | 
| +    return addStream(controller.stream).then((_) => this);
 | 
| +  }
 | 
| +
 | 
|    Future close() {
 | 
|      if (_isBound) {
 | 
|        throw new StateError("StreamSink is bound to a stream");
 | 
| 
 |