JavaScript. Подробное руководство, 6-е издание, стр. 164
<b>// Входной поток </b><b>s.on("data", f); // При появлении данных передать их функции f() в аргументе</b><b>s.on("end", f); // событие "end" возникает по достижении конца файла,</b><b> // когда данные больше не могут поступить</b><b>s.оп("еrror", f); // Если что-то не так, передаст исключение функции f()</b><b>s.readable // => true, если поток по-прежнему открыт для чтения </b><b>s.pause();// Приостановит отправку событий "data".</b><b> // Например, чтобы уменьшить скорость выгрузки</b><b>s.resume(); // Возобновит отправку событий "data"</b><b>// Определяет кодировку, если обработчику события "data" данные должны </b><b>// передаваться в виде строк</b><b>s.setEncoding(enc); // Как декодировать байты: "utf8”, "ascii" или "base64"</b>Потоки, открытые для записи, не так тесно связаны с событиями, как потоки, открытые для чтения. Метод
<b>write()</b><b>end()</b><b>write()</b><b>write()</b><b>false</b><b>// Выходной поток s: </b><b>s.write(buffer); // Запись двоичных данных </b><b>s.write(string, encoding) // Запись строковых данных.</b><b> // по умолчанию encoding = "utf-8"</b><b>s.end() // Закроет поток.</b><b>s.end(buffer); // Запишет последнюю порцию данных и закроет поток.</b><b>s.end(str, encoding) // Запишет последнюю строку и закроет поток </b><b>s.writeable; // true, если поток по-прежнему открыт для записи </b><b>s.on("drain", f) // f() будет вызываться при опустошении внутр. буфера</b>Как видно из примеров выше, потоки ввода/вывода, реализованные в интерпретаторе Node, могут работать и с двоичными, и с текстовыми данными. Текст передается с использованием простых строк JavaScript. Байты обрабатываются с помощью специфического для Node типа данных
<b>Buffer</b><b>var bytes = new Buffer(256); //Создать новый буфер на 256 байт </b><b>for (var i = 0; i < bytes.length; i++) //Цикл по индексам</b><b>bytes[i]=i //Установить каждый элемент в буфере </b><b>var end = bytes.slice(240,256) //Получить срез буфера </b><b>end[0] //=> 240: end[0] = bytes[240]</b><b>end[0]=0 //Изменить элемент среза </b><b>bytes[240] //=> 0; буфер тоже изменится </b><b>var more=new Buffer(8); //Создать новый отдельный буфер </b><b>end.copy(more, 0, 8, 16) //Скопировать элементы 8-15 из end[] в more[] </b><b>more[0] //=> 248</b><b>// Буферы также позволяют выполнять преобразования двоичных данных в строки </b><b>// и обратно. Допустимые кодировки: "utf8", "ascii" и "base64". </b><b>// По умолчанию используется "utf8". </b><b>var buf = new Buffer("2пr", "utf8”); // Закодировать текст в байты, UTF-8 </b><b>buf.length // => 3 символа занимают 4 байта </b><b>buf.toSt ring() // => "2яг": обратно в текст </b><b>buf = new Buffer(10); // Новый буфер фиксированной длины </b><b>var len = buf.write("пr<sup>2</sup>", 4); // Записать текст, начиная с 4-го байта </b><b>buf.toString(”utf8”,4, 4+len) // => "пr<sup>2</sup>": декодировать диапазон байтов </b>Инструменты интерпретатора Node для работы с файлами и файловой системой находятся в модуле «fs»:
<b>var fs = require("fs"); // Загрузит инструменты для работы с файловой системой </b>