JavaScript. Подробное руководство, 6-е издание, стр. 162
<b> JOptionPane.ERROR.MESSAGE); </b><b> } </b><b>});</b><b>// Использует java.net.URL и др. для загрузки содержимого URL и использует java.io.File </b><b>// и др. для сохранения этого содержимого в файле. Отображает ход выполнения загрузки </b><b>// в компоненте JProgressBar. Эта функция вызывается в новом потоке выполнения, </b><b>function download(url, file) {</b><b> try {</b><b> // Каждый раз, когда запускается загрузка очередного файла,</b><b> // необходимо добавить в окно новую строку для отображения URL,</b><b> // имени файла и индикатора хода выполнения операции </b><b> var row = Box.createHorizontalBox(); // Создать строку</b><b>row.setBorder(padding); // Добавить отступы </b><b>var label = url.toString() + ": ";// Отобразить URL </b><b>row.add(new JLabel(label)); // в компоненте JLabel </b><b>var bar = new JProgressBar(0, 100); // Создать полосу индикатора </b><b>bar.stringPainted = true; // Отобразить имя файла </b><b>bar.string = file.toString(); // в полосе индикатора </b><b>row.add(bar);// Добавить индикатор в строку </b><b>col.add(row);// Добавить строку в колонку </b><b>frame.pack(); // Изменить размер окна</b><b> // Здесь еще не известен размер загружаемого файла, поэтому изначально </b><b> // индикатор просто воспроизводит анимационный эффект </b><b> bar.indeterminate = true;</b><b> // Установить соединение с сервером и получить размер загружаемого</b><b> // файла, если это возможно</b><b> var conn = url.openConnection(); // Получить java.net.URLConnection </b><b> conn.connect(); // Подключиться и ждать заголовки</b><b> var len = conn.contentLength; // Проверить, получена ли длина файла</b><b> if (len) { // Если длина известна, тогда</b><b> bar.maximum = len; // настроить индикатор на вывод</b><b> bar.indeterminate = false; // процента выполнения задания</b><b> }</b><b> // Получить потоки ввода и вывода</b><b> var input = conn.inputStream; // Прочитать байты с сервера</b><b> var output = new FileOutputStream(file); // Записать в файл </b><b> // Создать входной буфер в виде массива размером 4 Кбайта</b><b> var buffer = java.lang.reflect.Array.newlnstance(java.lang.Byte.TYPE,4096);</b><b> var num;</b><b> while((num=input.read(buffer)) != -1) { // Читать до признака EOF</b><b> output.write(buffer, 0, num); // Записать байты в файл</b><b> bar.value += num; // Обновить индикатор</b><b> }</b><b> output.close(); // Закрыть потоки по завершении</b><b> input.close();</b><b> }</b><b> catch(e) { // Если что-то пошло не так, вывести ошибку в индикаторе </b><b> if (bar) {</b><b> bar.indeterminate = false; // Остановить анимацию</b><b> bar.string = e.toString(); // Заменить имя файла сообщением</b><b> }</b><b> }</b><b>}</b>12.2. Асинхронный ввод/вывод в интерпретаторе Node
Node - это быстрый интерпретатор JavaScript, написанный на языке C++, включающий средства доступа к низкоуровневым интерфейсам Unix для работы с процессами, файлами, сетевыми сокетами и так далее, а также к клиентским и серверным интерфейсам реализации протокола HTTP. За исключением нескольких синхронных методов, имеющих специальные имена, все остальные инструменты интерпретатора Node доступа к интерфейсам Unix являются асинхронными, и по умолчанию программы, выполняемые под управлением Node, никогда не блокируются, что обеспечивает им хорошую масштабируемость и позволяет эффективно справляться с высокой нагрузкой. Поскольку прикладные программные интерфейсы являются асинхронными, интерпретатор Node опирается на использование обработчиков событий, которые часто реализуются с использованием вложенных функций и замыканий. [26]
Этот раздел освещает некоторые наиболее важные инструменты и события, имеющиеся в составе Node, но это описание ни в коем случае нельзя считать полным. Полное описание Node можно найти в электронной документации по адресу http://nodejs.org/api/.
Node - это свободное программное обеспечение, которое можно загрузить по адресу http://nodejs.org. На момент написания этих строк интерпретатор все еще активно разрабатывался и скомпилированные дистрибутивы не были доступны, однако вы можете собрать собственную копию интерпретатора из исходных текстов. Примеры в этом разделе опробовались под управлением версии Node 0.4. Прикладной интерфейс интерпретатора еще не зафиксирован, однако основные функции, демонстрируемые в этом разделе, едва ли сильно изменятся в будущем.