gpt4 book ai didi

javascript - 使用 Mozilla 附加组件读取原始数据

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:34:44 25 4
gpt4 key购买 nike

我正在尝试使用 Mozilla 的附加 SDK 从文件中读取和写入原始数据。目前我正在读取类似的数据:

function readnsIFile(fileName, callback){
var nsiFile = new FileUtils.File(fileName);
NetUtil.asyncFetch(nsiFile, function (inputStream, status) {
var data = NetUtil.readInputStreamToString(inputStream, inputStream.available(),{charset:"UTF-8"});
callback(data, status, nsiFile);
});
}

这适用于文本文件,但当我开始处理超出 Unicode 正常范围的原始字节时,它就不起作用了。例如,如果文件包含字节 0xff,则根本不会读取该字节和该字节之后的任何内容。有什么方法可以使用 SDK 读取(和写入)原始数据吗?

最佳答案

您已在 NetUtil.readInputStream 的选项中指定了显式 charset

当您省略 charset 选项时,数据将被读取为原始字节。 ( Source )

function readnsIFile(fileName, callback){
var nsiFile = new FileUtils.File(fileName);
NetUtil.asyncFetch(nsiFile, function (inputStream, status) {
// Do not specify a charset at all!
var data = NetUtil.readInputStreamToString(inputStream, inputStream.available());
callback(data, status, nsiFile);
});
}

使用 io/byte-streams 的建议也可以,但请记住该 SDK 模块仍标记为实验性,并且通过 ByteReader 使用 io/file 如示例所示不是一个好主意,因为这将是主线程上的同步 I/O。我真的看不到好处,因为无论如何您都会使用 NetUtil

无论如何,这应该有效:

const {ByteReader} = require("sdk/io/byte-streams");
function readnsIFile(fileName, callback){
var nsiFile = new FileUtils.File(fileName);
NetUtil.asyncFetch(nsiFile, function (inputStream, status) {
var reader = new ByteReader(inputStream);
var data = reader.read(inputStream);
reader.close();
callback(data, status, nsiFile);
});
}

另外,请记住,像这样读取大文件是有问题的。显然,整个文件不仅会缓冲在内存中,而且:

  • 文件首先被读取为一个char(字节)数组,所以在流中会有一个至少file.size长度的临时缓冲区(通过asyncFetch).
  • NetUtil.readInputStreamToStringByteReader 都将使用另一个 char(字节)数组从 inputStream< 中读取结果,但 ByteReader 将以 32K block 的形式执行此操作,而 NetUtil.readInputStreamToString 将使用 file.length 的大缓冲区。
  • 然后将数据读入生成的 jschar/wchar_t(字)数组。 Javascript 字符串,即你至少需要 file.size * 2 字节的内存。

例如,读取一个 1MB 的文件需要超过 fileSize * 4 = 4MB 内存 (NetUtil.readInputStreamToString) 和/或超过 fileSize * 3 = 读取操作期间的 3MB 内存 (ByteReader)。操作后,该内存的 2MB 将仍然存在,以将结果数据存储在 Javascript 字符串中。

读取 1MB 的文件可能没问题,但 10MB 的文件在移动设备(Firefox for Android、Firefox OS)上可能已经存在问题,而 100MB 的文件即使在桌面上也会有问题。

您还可以将数据直接读入ArrayBuffer(或Uint8Array),它比Javascript 字符串更有效地存储字节数组并避免临时缓冲区NetUtil.readInputStreamToString 和/或 ByteReader

function readnsIFile(fileName, callback){
var nsiFile = new FileUtils.File(fileName);
NetUtil.asyncFetch(nsiFile, function (inputStream, status) {
var bs = Cc["@mozilla.org/binaryinputstream;1"].
createInstance(Ci.nsIBinaryInputStream);
bs.setInputStream(inputStream);
var len = inputStream.available();
var data = new Uint8Array(len);
reader.readArrayBuffer(len, data.buffer);
bs.close();
callback(data, status, nsiFile);
});
}

PS:如果 NetUtil.readInputStreamToString 调用中省略了 charset 选项,MDN 文档可能会说明“iso-8859-1”是默认值,但是文档是错误的。我会修复它。

关于javascript - 使用 Mozilla 附加组件读取原始数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23821154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com