Index: sdk/lib/io/file_impl.dart |
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart |
index 71e3ffefd6c0b7203efb08a0c32d0c19bea8a336..f9eef32f004ab2da85675aeadcdd09085ba99fa4 100644 |
--- a/sdk/lib/io/file_impl.dart |
+++ b/sdk/lib/io/file_impl.dart |
@@ -436,29 +436,51 @@ class _File extends FileSystemEntity implements File { |
} |
Future<List<int>> readAsBytes() { |
- Completer<List<int>> completer = new Completer<List<int>>(); |
- var builder = new BytesBuilder(); |
- openRead().listen( |
- (d) => builder.add(d), |
- onDone: () { |
- completer.complete(builder.takeBytes()); |
- }, |
- onError: (e, StackTrace stackTrace) { |
- completer.completeError(e, stackTrace); |
- }, |
- cancelOnError: true); |
- return completer.future; |
+ Future<List<int>> readDataChunked(file) { |
+ var builder = new BytesBuilder(copy: false); |
+ var completer = new Completer(); |
+ void read() { |
+ file.read(_BLOCK_SIZE).then((data) { |
+ if (data.length > 0) builder.add(data); |
+ if (data.length == _BLOCK_SIZE) { |
+ read(); |
+ } else { |
+ completer.complete(builder.takeBytes()); |
+ } |
+ }, onError: completer.completeError); |
+ } |
+ read(); |
+ return completer.future; |
+ } |
+ |
+ return open().then((file) { |
+ return file.length().then((length) { |
+ if (length == 0) { |
+ // May be character device, try to read it in chunks. |
+ return readDataChunked(file); |
+ } |
+ return file.read(length); |
+ }).whenComplete(file.close); |
+ }); |
} |
List<int> readAsBytesSync() { |
var opened = openSync(); |
- var builder = new BytesBuilder(); |
var data; |
- while ((data = opened.readSync(_BLOCK_SIZE)).length > 0) { |
- builder.add(data); |
+ var length = opened.lengthSync(); |
+ if (length == 0) { |
+ // May be character device, try to read it in chunks. |
+ var builder = new BytesBuilder(copy: false); |
+ do { |
+ data = opened.readSync(_BLOCK_SIZE); |
+ if (data.length > 0) builder.add(data); |
+ } while (data.length == _BLOCK_SIZE); |
+ data = builder.takeBytes(); |
+ } else { |
+ data = opened.readSync(length); |
} |
opened.closeSync(); |
- return builder.takeBytes(); |
+ return data; |
} |
String _tryDecode(List<int> bytes, Encoding encoding) { |