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