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

По мере чтения содержимого указанного двоичного объекта объект

<b>FileReader</b>
будет обновлять значение своего свойства
<b>readyState</b>
. Первоначально это свойство получает значение 0, показывающее, что еще ничего не было прочитано. Когда становятся доступны какие-нибудь данные, оно принимает значение 1 и по окончании чтения - значение 2. Свойство
<b>result</b>
хранит частично или полностью прочитанные данные в виде строки или объекта
<b>ArrayBuffег</b>
. Веб-приложения обычно не опрашивают свойства
<b>readyState</b>
и
<b>result</b>
и вместо этого используют обработчик события
<b>onprogress</b>
или
<b>onload</b>
.

Пример 22.11 демонстрирует, как использовать метод

<b>readAsText()</b>
для чтения локальных текстовых файлов, выбранных пользователем.

Пример 22.11. Чтение текстовых файлов с помощью объекта

<b>FileReader</b>

<b>&lt;script&gt;</b>

<b>// Читает указанный текстовый файл и отображает его в элементе &lt;рге&gt; ниже</b>

<b>function readfile(f) {</b>

<b>  var reader = new FileReader(); // Создать объект FileReader</b>

<b>  reader.readAsText(f); // Прочитать файл</b>

<b>  reader.onload = function() { // Определить обработчик события</b>

<b>    var text = reader.result; 11 Это содержимое файла</b>

<b>    var out = document.getElementById(&quot;output&quot;); // Найти элемент output</b>

<b>    out.innerHTML = // Очистить его</b>

<b>    out.appendChild(document.createTextNode(text));// Вывести содержимое </b>

<b>  } // файла</b>

<b>  reader.onerror = function(e) { // Если что-то пошло не так</b>

<b>    console.log(&quot;Error&quot;, .e); // Вывести сообщение об ошибке</b>

<b>  };</b>

<b>}</b>

<b>&lt;/script&gt;</b>

<b>// Выберите файл для отображения:</b>

<b>&lt;input type=&quot;file&quot; onchange=”readfile(this. files[0])&quot;x/input&gt;</b>

<b>&lt;pre id=&quot;output&quot;x/pre&gt;</b>

Метод

<b>readAsArrayBuffer()</b>
похож на метод
<b>readAsText(),</b>
за исключением того, что требует приложить чуть больше усилий при работе с результатом, возвращая объект
<b>ArrayBuffег</b>
вместо строки. Пример 22.12 демонстрирует использование метода
<b>readAsArrayBuffer()</b>
для чтения первых четырех байтов из файла в виде целого числа с прямым порядком следования байтов.

Пример 22.12. Чтение первых четырех байтов из файла

<b>&lt;script&gt;</b>

<b>// Исследует первые 4 байта в указанном двоичном объекте. Если это &quot;сигнатура&quot;,</b>

<b>// определяющая тип файла, асинхронно устанавливает свойство двоичного объекта.</b>

<b>function typefile(file) {</b>

<b>  var slice = file.slice(0,4); // Читать только первые 4 байта</b>

<b>  var reader = new FileReader(); // Создать асинхронный FileReader</b>

<b>  reader.readAsArrayBuffer(slice); // Прочитать фрагмент файла</b>

<b>  reader.onload = function(e) {</b>

<b>    var buffer = reader.result; // Результат - ArrayBuffer</b>

<b>    var view = new DataView(buffer); // Получить доступ к результату</b>

<b>    var magic = view.getUint32(0, false); // 4 байта, прямой порядок</b>

<b>    switch(magic) { // Определить по ним тип файла</b>

<b>    case 0х89504Е47: file.verified_type = &quot;image/png&quot;; break;</b>

<b>    case 0x47494638: file.verified_type = &quot;image/gif&quot;; break;</b>

<b>    case 0x25504446: file.verified_type = &quot;application/pdf&quot;; break;</b>

<b>    case 0x504b0304: file.verified_type = &quot;application/zip&quot;; break;</b>

<b>    }</b>

<b>    console.log(file.name, file.verified_type);</b>

<b>  };</b>

<b>}</b>

<b>&lt;/script&gt;</b>

<b>&lt;input type=&quot;file&quot; onchange=&quot;typefile(this. files[0])”&gt;&lt;/input&gt;</b>

В фоновых потоках выполнения вместо объекта

<b>FileReader</b>
можно использовать объект
<b>FileReaderSync</b>
. Синхронный прикладной интерфейс определяет те же методы
<b>readAsText()</b>
и
<b>readAsArrayBuffer(),</b>
которые принимают те же аргументы, что и их асинхронные версии. Разница заключается лишь в том, что синхронные методы блокируются до окончания операции и непосредственно возвращают результат в вид строки или объекта
<b>ArrayBuffer</b>
, что избавляет от необходимости использовать обработчики событий. Пример 22.14 ниже демонстрирует использование объекта
<b>FileReaderSync</b>
.

22.7. Прикладной интерфейс к файловой системе

В разделе 22.6.5 вы познакомились с классом

<b>FileReader</b>
, использовавшимся для чтения содержимого файлов, выбираемых пользователем, или любых двоичных объектов. Типы
<b>File</b>
и
<b>Blob</b>
определяются проектом спецификации, известной как «File АРІ». Проект другой спецификации, еще более новой, чем «File АРІ», дает веб-приложениям управляемый доступ к частной файловой системе, где они могут писать в файлы, читать файлы, создавать каталоги, читать содержимое каталогов и т. д. На момент написания этих строк данный прикладной интерфейс к файловой системе был реализован только в броузере Google Chrome. Это мощная и важная форма локального хранилища, поэтому она будет описана здесь, несмотря на то что ее прикладной интерфейс еще менее стабилен, чем другие прикладные интерфейсы, описываемые в этой главе. Данный раздел охватывает лишь основные задачи, выполняемые с файловой системой, и не демонстрирует всех возможностей прикладного интерфейса. Так как обсуждаемый здесь прикладной интерфейс является новым и нестабильным, он не описывается в справочном разделе этой книги.