繁体   English   中英

异步逐行读取文件

[英]async line-by-line file reading

当我尝试同步读取文件时,Firefox冻结。 当我尝试异步读取文件时,我得到的是数字而不是单词。

此代码段...

var MY_ID = "cbdeltrem1984@bol.com.br";
var em = Components.classes["@mozilla.org/extensions/manager;1"].getService(Components.interfaces.nsIExtensionManager);
var file = em.getInstallLocation(MY_ID).getItemFile(MY_ID, "wordlist.txt");

...加上此代码段...

var appInfo=Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo);
var isOnBranch = appInfo.platformVersion.indexOf("1.8") == 0;
var ios=Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
var fileURI=ios.newFileURI(file);
var channel = ios.newChannelFromURI(fileURI);
var observer = {
    onStreamComplete : function(aLoader, aContext, aStatus, aLength, aResult) {
        alert(aResult);
    }
};
var sl = Components.classes["@mozilla.org/network/stream-loader;1"].createInstance(Components.interfaces.nsIStreamLoader);
if (isOnBranch) {
    sl.init(channel, observer, null);
} else {
    sl.init(observer);
    channel.asyncOpen(sl, channel);
}

...提示数字而不是单词。

如何逐行异步读取文件?

下面的示例可以异步读取文件,而无需锁定UI线程(尽管由于我使用了模块,所以仅适用于FF4 +)。 不会逐行读取...而且,尽管如此,我还是认为它是文本文件。

    Components.utils.import("resource://gre/modules/NetUtil.jsm");  

    NetUtil.asyncFetch(file, function(inputStream, status) {  
      if (!Components.isSuccessCode(status)) {  
        // Handle error!  
        return;  
      }  

      // The file data is contained within inputStream.  
      // You can read it into a string with  
      var data = NetUtil.readInputStreamToString(inputStream, inputStream.available());
      Components.utils.reportError("data:" + data);
    }); 

资料来源:

  1. https://developer.mozilla.org/en/JavaScript_code_modules/NetUtil.jsm
  2. https://developer.mozilla.org/zh_CN/Code_snippets/File_I%2F%2FO#Read_into_a_stream_or_a_string

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM