Загруженные данные усекаются при использовании nsIFileInputStream & nsIConverterInputStream - PullRequest
0 голосов
/ 27 августа 2009

Я работаю над проектом (BrowserIO - перейдите на browserio dot googlecode dot com, если вы хотите проверить код и поработать над ним. Помогите приветствовать!), В котором я использую nsIFileInputStream в Firefox вместе с 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. Посмотрите на файл ... Он должен быть усечен, если только он не очень короткий.

Для справки, приведенный выше код является основной частью функции openFile () в trunk / scripts / file_io.js.

Кто-нибудь знает, что с этим происходит?

Ответы [ 2 ]

2 голосов
/ 27 августа 2009

См. nsIConverterInputStream ; в основном, -1 означает не «дай мне все», а «дай мне сумму по умолчанию», которую, как утверждают документы, составляет 8192.

В более общем смысле, если вы хотите исчерпать содержимое входного потока, вы должны выполнить цикл, пока он не станет пустым. Ничто в любом из потоковых контрактов не гарантирует, что объем данных, возвращаемых вызовом, является полным содержимым потока; он мог бы даже вернуть меньше, чем имел сразу же, если бы захотел.

0 голосов
/ 27 августа 2009

Я обнаружил, как читать файл без преобразования, чтобы избежать проблем, связанных с незнанием типа кодировки файла. Ответ должен использовать 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());
...