0

私はプロジェクトに取り組んでいます(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を使用しdata = str.value;てfile_io.jsの行にブレークポイントを設定します。次に、リストからテキストファイルを選択し、[開く]ボタンをクリックします。Firebugで、ウォッチパネルでstr.valueのウォッチを設定します。ファイルを見てください...本当に短い場合を除いて、切り捨てる必要があります。

参考までに、上記のコードは、trunk / scripts / file_io.jsのopenFile()関数の本体です。

誰かがこれで何が起こっているのか手がかりがありますか?

4

2 に答える 2

2

nsIConverterInputStreamを参照してください; 基本的に、-1は「すべてを私に与える」という意味ではなく、「デフォルトの金額を私に与える」という意味であり、ドキュメントによると8192です。

より一般的には、入力ストリームの内容を使い果たしたい場合は、空になるまでループする必要があります。ストリームコントラクトのいずれにも、呼び出しによって返されるデータの量がストリームのコンテンツ全体であることを保証するものはありません。必要に応じて、すぐに利用できるよりも少ない金額を返すこともできます。

于 2009-08-27T01:00:15.417 に答える
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());
于 2009-08-27T05:55:51.293 に答える