目前我使用如下模式来读取一系列文件的前 3 个字符:
var files = e.dataTransfer.files;
for (var i = 0, f; f = files[i]; i++) {
var fr = new FileReader();
fr.onload = function(e) {
var first_three_chars = e.target.result.substr(0,3);
}
fr.readAsText(f);
}
问题是我只对文件的前3个字符感兴趣,而这种方法会读取整个文件,浪费大量内存和时间。如何快速迭代文件,只需快速浏览第一个字符?
编辑:slice() 就是答案,谢谢 sshen。我是这样做的:
var files = e.dataTransfer.files;
for (var i = 0, f; f = files[i]; i++) {
var fr = new FileReader();
fr.onloadend = function(e) {
if (e.target.readyState == FileReader.DONE) {
var first_three_chars = e.target.result;
}
};
var blob = f.slice(0, 3);
fr.readAsText(blob);
}
您可以使用
.slice
方法。您可以阅读更多这里
var reader = new FileReader();
reader.onloadend = function(evt)
{
if (evt.target.readyState == FileReader.DONE) // DONE == 2
{
alert(evt.target.result);
}
};
var blob = file.slice(start, stop + 1);
reader.readAsBinaryString(blob);
没有足够的代表发表评论,所以在这里提出一些关于 @Stu Blair 解决方案的警告: 使用
Blob.slice
方法,您将从 Blob 中获取 bytes,而不是 characters。
例如,这是行不通的:
const blob = new Blob(['😀'], {type: 'text/plain'});
const fr = new FileReader();
fr.readAsText(blob); // Fine, fr.result will be '😀'
fr.readAsText(blob.slice(0, 2)); // Not good, fr.result will be '��'
您必须使用
FileReader.readAsArrayBuffer
来获取字节。如果您的编码类似于 utf-8,您将必须从头开始阅读。