2010-09-19 94 views
1

當我嘗試同步讀取文件時,Firefox會凍結。 當我嘗試異步讀取文件時,我得到的是數字而不是單詞。異步逐行文件讀取

這段代碼...

var MY_ID = "[email protected]"; 
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); 
} 

...警報數字代替文字。

如何逐行異步讀取文件?

回答

0

下面的示例可以在不鎖定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/en/Code_snippets/File_I%2F%2FO#Read_into_a_stream_or_a_string