无法在javascript中读取文件的完整内容

时间:2013-02-15 09:23:05

标签: javascript file-io

我有这段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字节的方式。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

我可能错了,但您是否尝试过发送一个简单的GET请求?在AJAX?或者您是否真的想使用JS?

编辑: 请参阅此内容 - How do I load the contents of a text file into a javascript variable?