【发布时间】:2018-10-19 15:22:27
【问题描述】:
如何通过块(2kb或更多)在本地读取任何大文件(大于1 GB),然后将块转换为字符串,处理字符串然后获取下一个块,依此类推,直到结束文件?
我只能读取小文件并将其转换为字符串,从代码中可以看出我不知道如何分块读取文件。如果我尝试使用大于 10mb 的文件,浏览器会冻结。
<html>
<head>
<title>Read File</title>
</head>
<body>
<input type="file" id="myFile">
<hr>
<textarea style="width:500px;height: 400px" id="output"></textarea>
<script>
var input = document.getElementById("myFile");
var output = document.getElementById("output");
input.addEventListener("change", function () {
if (this.files && this.files[0]) {
var myFile = this.files[0];
var reader = new FileReader();
reader.addEventListener('load', function (e) {
output.textContent = e.target.result;
});
reader.readAsBinaryString(myFile);
}
});
</script>
</body>
</html>
以下是我在研究如何完成它时在 StackOverflow 上找到的链接和答案,但它并没有解决我的问题。
1: 这个问题是在询问如何使用 UniversalXPConnect,并且仅在 Firefox 中,这就是为什么我发现那里的答案无关紧要,因为我使用 Chrome 并且不知道UniversalXPConnect 是什么。 How to read a local file by chunks in JavaScript
2: 这个问题是在询问如何仅读取文本文件,但我希望能够读取任何文件,而不仅仅是文本,也可以按块读取,这使得那里的答案无关紧要,但我喜欢答案的代码有多短。 Reading local text file into a JavaScript array [duplicate]
3:这也是关于文本文件的,并没有展示如何按块读取文件How to read a local text file.
我懂一点Java,你可以很容易地做到这一点;
char[] myBuffer = new char[512];
int bytesRead = 0;
BufferedReader in = new BufferedReader(new FileReader("foo.mp4"));
while ((bytesRead = in.read(myBuffer,0,512)) != -1){
...
}
但我是 javascript 新手
【问题讨论】:
-
您是否尝试在浏览器中执行此操作?还是您使用的是 Node.js?
-
是的,我正在尝试使用浏览器来实现它。谢谢。
-
FileReader 应该是异步的,并且您实际上并不想在这些分块读取之间做任何事情,所以我认为它可能不是您想要的。换一种说法:为什么你会期望分块阅读它会比你已经看到的更好?出于测试目的,我还将查看浏览器是否在读取或输出时冻结。将“加载”回调更改为类似于
console.log("Done Reading!");如果在看到之前没有冻结,则它是浏览器的输出。 -
刚刚测试过。肯定会看到浏览器冻结,而且肯定是 在 文件被读取之后。所以你需要一种方法来循环遍历结果,而不是文件本身。可能
readAsArrayBuffer是一个不错的起点。
标签: javascript html performance file filereader