使用nsIFileInputStream&时加载的数据被截断nsIConverterInputStream

时间:2009-08-26 20:32:31

标签: javascript firefox xpcom

我正在开发一个项目(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()函数的主体。

有人知道发生了什么事吗?

2 个答案:

答案 0 :(得分:2)

nsIConverterInputStream;基本上,-1并不意味着“给我一切”,而是“给我默认金额”,文档声称是8192。

更一般地说,如果要耗尽输入流的内容,则必须循环直到它为空。任何流合同中的任何内容都不保证调用返回的数据量是流的全部内容;如果它想要,它甚至可以返回少于它可以立即获得的数量。

答案 1 :(得分:0)

我发现如何在不转换的情况下读取文件,以避免因不知道文件编码类型而导致的问题。答案是nsIScriptableInputStream使用nsIFileInputStream

var sstream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream);
fstream.init(file, 0x01, 0004, 0);
sstream.init(fstream);
data = sstream.read(sstream.available());