Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(293)

Unified Diff: sdk/lib/io/file_impl.dart

Issue 218493012: Make non-copying version of BytesBuidler and make file-reads faster. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sdk/lib/io/data_transformer.dart ('k') | sdk/lib/io/websocket_impl.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
« no previous file with comments | « sdk/lib/io/data_transformer.dart ('k') | sdk/lib/io/websocket_impl.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698