2009-08-26 3 views
0

私はプロジェクトに取り組んでいます(BrowserIO - コードをチェックアウトして作業したい場合はbrowserio dot googlecodeドットコムに行きます。 nsIConverterInputStreamと連携してFirefoxのnsIFileInputStreamを使用しています(例:https://developer.mozilla.org/en/Code_snippets/File_I%2F%2FO#Simple)。ただし、完全なデータの一部だけが読み込まれています。コードは次のとおりです。nsIFileInputStreamとnsIConverterInputStreamを使用するとロードされたデータが切り捨てられます

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プロジェクトページからコードをチェックアウトし、file_io.jsでdata = str.value;行にブレークポイントを設定するためにFirebugのを使用したい場合。次に、リストからテキストファイルを選択し、「開く」ボタンをクリックします。 Firebugでは、時計パネルにstr.valueの時計を設定します。ファイルを見てください...本当に短い場合を除いて、切り捨てられるべきです。

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

これには何が起こっているのですか?

答えて

2

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

もっと一般的に言えば、入力ストリームの内容を使い果たすには、それが空になるまでループする必要があります。いずれのストリーム契約でも、コールによって返されるデータの量がストリームの内容全体であることを保証するものはありません。それが望むなら、すぐに利用可能なものよりも少なくても返すことができます。

+0

ええ、私はそれを考え出しました。私が今持っているもう一つの問題は、コンバーターストリームを通してコンテンツを渡すときに、ファイルのエンコードタイプを事前に知る必要があるということです。たとえば、私はUTF-8とLatin-1(ISO-8859-1)の2つのファイルを持っています。エンコーディングを指定すると、1つのタイプのファイルでしか動作しません。 fstreamオブジェクト/ nsIFileInputStreamから直接データにアクセスする方法を知っていますか? MDCドキュメントを今すぐブラウザーで見つけてください。 –

+0

以下の考え方はうまくいきますが、必要な値は文字列ではありません。それは本当に適切にバイト配列です。後者の取得は簡単で、nsIScriptableStreamではなくnsIBinaryInputStreamを使用するだけです。ただし、フードの下のnsIScriptableInputStream.readはchar *を返します。ファイルにnullバイトが含まれている場合はどうなりますか? C++ - > JSコードは、返されるchar *がstrlenより大きい長さを持つことを知る方法がないため、ファイルにNULLが含まれている場合、切り詰められた文字列を取得します。ここでは問題ではないかもしれませんが、私の本では火で遊んでいます。私はそれを避けたいと思います。 –

0

ファイルのエンコードタイプが分からないという問題を避けるため、変換せずにファイルを読み込む方法を発見しました。答えはnsIFileInputStreamnsIScriptableInputStreamを使用することです:私はそれを周りに少し混乱した後

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()); 
+0

docsから: "注:このメソッド(available())は、ストリームがローカルファイルに対応していても、ストリームの合計サイズを決定するために使用すべきではなく、また、ストリームが2^32バイトのデータでは、このメソッドは基になるデータソースのサイズ全体を表現することができません。 https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIScriptableInputStream#available() – makdad

関連する問題