我正在研究一个项目(BrowserIO-如果您想检查代码并继续工作,请访问browserio dot googlecode dot com。请帮助!),在该项目中,我将Firefox的nsIFileInputStream与nsIConverterInputStream结合使用(https://developer.mozilla.org/en/Code_snippets/File_I%2F%2FO#Simple),但仅加载全部数据的一部分。代码是:
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(path);
var data = "";
var fstream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
var cstream = Components.classes["@mozilla.org/intl/converter-input-stream;1"].createInstance(Components.interfaces.nsIConverterInputStream);
fstream.init(file, -1, 0, 0);
cstream.init(fstream, "UTF-8", 0, 0); // you can use another encoding here if you wish
var str = {};
cstream.readString(-1, str); // read the whole file and put it in str.value
data = str.value;
cstream.close(); // this closes fstream
如果要查看此行为,请从BrowserIO项目页面中检出代码,然后使用Firebug在file_io.js中的
data = str.value;
行处设置断点。然后从列表中选择一个文本文件,然后单击“打开”按钮。在Firebug中,在监视面板中为str.value设置监视。查看文件...应该截短它,除非它真的很短。供参考,上面的代码是trunk / scripts / file_io.js中openFile()函数的主体。
有人知道这是怎么回事吗?
最佳答案
参见nsIConverterInputStream;基本上,-1并不意味着“给我一切”,而是“给我默认值”,文档声称为8192。
更一般而言,如果要耗尽输入流的内容,则必须循环直到其为空。流合同中的任何内容都不能保证调用返回的数据量是流内容的全部。如果需要的话,它的回报甚至可能少于立即可用的回报。