JavaScript. Подробное руководство, 6-е издание, стр. 164

<b>// Входной поток </b>

<b>s.on(&quot;data&quot;, f); // При появлении данных передать их функции f() в аргументе</b>

<b>s.on(&quot;end&quot;, f); // событие &quot;end&quot; возникает по достижении конца файла,</b>

<b>              // когда данные больше не могут поступить</b>

<b>s.оп(&quot;еrror&quot;, f); // Если что-то не так, передаст исключение функции f()</b>

<b>s.readable // =&gt; true, если поток по-прежнему открыт для чтения </b>

<b>s.pause();// Приостановит отправку событий &quot;data&quot;.</b>

<b>        // Например, чтобы уменьшить скорость выгрузки</b>

<b>s.resume();  // Возобновит отправку событий &quot;data&quot;</b>

<b>// Определяет кодировку, если обработчику события &quot;data&quot; данные должны </b>

<b>// передаваться в виде строк</b>

<b>s.setEncoding(enc); // Как декодировать байты: &quot;utf8”, &quot;ascii&quot; или &quot;base64&quot;</b>

Потоки, открытые для записи, не так тесно связаны с событиями, как потоки, открытые для чтения. Метод

<b>write()</b>
таких потоков используется для отправки данных, а метод
<b>end()</b>
- для закрытия потока, когда все данные будут записаны. Метод
<b>write()</b>
никогда не блокируется. Если интерпретатор Node окажется не в состоянии записать данные немедленно и во внутреннем буфере потока не окажется сводного места, метод
<b>write()</b>
вернет
<b>false</b>
. Чтобы узнать, когда интерпретатор вытолкнет буфер и данные фактически будут записаны, можно зарегистрировать обработчик события «drain»:

<b>// Выходной поток s: </b>

<b>s.write(buffer);          // Запись двоичных данных </b>

<b>s.write(string, encoding) // Запись строковых данных.</b>

<b>                          // по умолчанию encoding = &quot;utf-8&quot;</b>

<b>s.end()                   // Закроет поток.</b>

<b>s.end(buffer);            // Запишет последнюю порцию данных и закроет поток.</b>

<b>s.end(str, encoding)      // Запишет последнюю строку и закроет поток </b>

<b>s.writeable;              // true, если поток по-прежнему открыт для записи </b>

<b>s.on(&quot;drain&quot;, f)          // f() будет вызываться при опустошении внутр. буфера</b>

Как видно из примеров выше, потоки ввода/вывода, реализованные в интерпретаторе Node, могут работать и с двоичными, и с текстовыми данными. Текст передается с использованием простых строк JavaScript. Байты обрабатываются с помощью специфического для Node типа данных

<b>Buffer</b>
. Буферы в интерпретаторе Node являются объектами, подобными массивам, с фиксированной длиной, элементами которых могут быть только числа в диапазоне от 0 до 255. Программы, выполняющиеся под управлением Node, часто интерпретируют буферы как непрозрачные блоки данных, читая их из одного потока и записывая в другой. Тем не менее байты в буфере доступны как обычные элементы массива, а сами буферы имеют методы, позволяющие копировать байты из одного буфера в другой, получать срезы буфера, записывать строки в буфер с использованием заданной кодировки и декодировать буфер или его часть обратно в строку:

<b>var bytes = new Buffer(256);           //Создать новый буфер на 256 байт </b>

<b>for (var i = 0; i &lt; bytes.length; i++) //Цикл по индексам</b>

<b>bytes[i]=i                             //Установить каждый элемент в буфере </b>

<b>var end = bytes.slice(240,256)         //Получить срез буфера </b>

<b>end[0]                                 //=&gt; 240: end[0] = bytes[240]</b>

<b>end[0]=0                               //Изменить элемент среза </b>

<b>bytes[240]                             //=&gt; 0; буфер тоже изменится </b>

<b>var more=new Buffer(8);                //Создать новый отдельный буфер </b>

<b>end.copy(more, 0, 8, 16)               //Скопировать элементы 8-15 из end[] в more[] </b>

<b>more[0]                                //=&gt; 248</b>

<b>// Буферы также позволяют выполнять преобразования двоичных данных в строки </b>

<b>// и обратно. Допустимые кодировки: &quot;utf8&quot;, &quot;ascii&quot; и &quot;base64&quot;. </b>

<b>// По умолчанию используется &quot;utf8&quot;. </b>

<b>var buf = new Buffer(&quot;2пr&quot;, &quot;utf8”); // Закодировать текст в байты, UTF-8 </b>

<b>buf.length                           // =&gt; 3 символа занимают 4 байта </b>

<b>buf.toSt ring()                      // =&gt; &quot;2яг&quot;: обратно в текст </b>

<b>buf = new Buffer(10);                // Новый буфер фиксированной длины </b>

<b>var len = buf.write(&quot;пr<sup>2</sup>&quot;, 4);       // Записать текст, начиная с 4-го байта </b>

<b>buf.toString(”utf8”,4, 4+len)        // =&gt; &quot;пr<sup>2</sup>&quot;: декодировать диапазон байтов </b>

Инструменты интерпретатора Node для работы с файлами и файловой системой находятся в модуле «fs»:

<b>var fs = require(&quot;fs&quot;); // Загрузит инструменты для работы с файловой системой </b>