0

我有这段 javascript 代码

var file = Components.classes["@mozilla.org/file/local;1"]
           .createInstance(Components.interfaces.nsILocalFile);
file.initWithPath( this.savefile );
if ( file.exists() == false ) {
   return null;
}
var is = Components.classes["@mozilla.org/network/file-input-stream;1"]
           .createInstance( Components.interfaces.nsIFileInputStream );
is.init( file,0x01, 00004, null);
var sis = Components.classes["@mozilla.org/scriptableinputstream;1"]
           .createInstance( Components.interfaces.nsIScriptableInputStream );
sis.init( is );
output = sis.read( sis.available() );

sis.close();
is.close();
this.filterData = output;
return output;

实际上我正在阅读的文件是一个二进制文件,可以说是 350 字节。现在 19 字节是“零”,所以在上面的代码中我只得到了 18 个字节的输出

当我尝试调试sis.available时确实返回 350。但是sis.read只能读取到零字节。

我想要在输出中读取整个 350 字节的方式。

4

2 回答 2

1

编辑

请参阅https://developer.mozilla.org/en-US/docs/Reading_textual_data

引用:

var charset = /* Need to find out what the character encoding is. Using UTF-8 for this example: */ "UTF-8";
var is = Components.classes["@mozilla.org/intl/converter-input-stream;1"]
               .createInstance(Components.interfaces.nsIConverterInputStream);
// This assumes that fis is the nsIInputStream you want to read from
is.init(fis, charset, 1024, 0xFFFD);
is.QueryInterface(Components.interfaces.nsIUnicharLineInputStream);

if (is instanceof Components.interfaces.nsIUnicharLineInputStream) {
  var line = {};
  var cont;
  do {
      cont = is.readLine(line);

      // Now you can do something with line.value
  } while (cont);
}

这避免了空字节问题,是 unicode 安全的,并且适用于不太深奥的对象类型。

原来的:

根据我上面的评论,并根据您的编辑,

请参阅https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIScriptableInputStream其中 read() 带有警告:如果数据包含空字节,则此方法将返回截断的字符串。您可能想改用 readBytes()。

或者,这是另一种方法:

var ph = Components.classes["@mozilla.org/network/protocol;1?name=file"]
          .createInstance(Components.interfaces.nsIFileProtocolHandler);

var file_to_read = ph.getURLSpecFromFile(file);

var req = new XMLHttpRequest();
req.onerror = function(e) {
        onError(e);
}


req.onreadystatechange = function() {
        if (log.readyState == 4) {
        //...
        }
}

req.open("GET", file_to_read, true);
于 2013-02-15T09:39:12.173 回答
0

我可能错了,但是您是否尝试过发送一个简单的GET请求?在 AJAX 中?还是你严格地想使用 JS?

编辑:请参阅此 -如何将文本文件的内容加载到 javascript 变量中?

于 2013-02-15T09:24:58.970 回答