JNLP API Java, Блог тільки про Java
Вчимося програмувати на Java з нуля
Головне меню
JNLP API Java

Натомість відображається файловий діалог, і користувач програми вибирає файл. Перед появою діалогового вікна для вибору файлів користувач отримує попередження та має висловити згоду на продовження роботи. Більш того, API не надає програмі доступу до об'єкта File.
Зокрема, програма не може самостійно виявити файл. Тому програмістам надаються інструменти для реалізації дій відкриття та збереження файлу, але системна інформація максимально прихована від сумнівних програм.API надає розробнику наведені нижче можливості:
- Завантаження та збереження файлів.
- Доступ до буфера обміну.
- Друк.
- Відображення документа у стандартному браузері.
- Зберігання та вилучення конфігураційних даних.
- Засоби, що дозволяють переконатися в тому, що виконується лише один екземпляр програми (дана можливість була реалізована Java SE 5.0).
Щоб скористатися цими можливостями, необхідно застосувати клас ServiceManager приблизно так:
Якщо відповідна функція недоступна, генерується виняток UnavailableServiceException.
Для компіляції програми, що використовує інтерфейс JNLP API, необхідно вказати у складі шляху пошуку класів файл javaws.jar. Цей файл знаходиться впідкаталогу jre/lib каталогу JDK.
Тепер перейдемо до обговорення найкорисніших можливостей JNLP. Щоб зберегти файл, слід вказати в діалоговому вікні пропозиції про початковий шлях і розширення файлів, а також дані, що зберігаються, і ім'я файлу. Розглянемо приклад:
Дані мають бути доставлені в потік InputStream. Іноді це завдання виявляється досить складним. Програма, наведена в кінці статті, використовує наведену нижче стратегію.
- Створюється екземпляр класу ByteArrayOutputStream, який призначений для зберігання байтів, що підлягають запису на диск.
- Створюється екземпляр класу PrintStream, що надсилає ці дані в потік ByteArrayOutputStream.
- Інформація, що підлягає збереженню в потоці друку, відображається в PrintStream.
- Створюється екземпляр класу ByteArrayInputStream, що зчитує збережені байти.
- Потік передається методом saveFileDialog().
Докладніше потоки описуються у цій рубриці. Поки що ми можемо не зважати на деталі, вказані в демонстраційній програмі наприкінці уроку.
Щоб рахувати дані з файлу, використовується клас FileOpenService. Його метод openFileDialog() отримує початковий шлях і розширення файлів і повертає об'єкт класу FileContents. Потім можна викликати метод getInputStream() і рахувати дані з файлу. Якщо користувач не вибрав файл, метод openFileDialog() повертає значення null.
Зверніть увагу, що ваша програма не знаєте імені та місця розташування файлу. На противагу цьому, якщо ви хочете відкрити певний файл, використовуєте ExtendedService.
Користувач вашої програми повинен дозволити доступ до файлу (див. мал.2).

Щоб відобразити документ у стандартному браузері (аналогічно методу showDocument() для аплетів), застосовується інтерфейс BasicService. Зверніть увагу, що в деяких системах стандартний браузер не встановлений.
Існує застарілий метод PersistentService(), що дозволяє застосунку зберігати невеликі обсяги інформації про налаштування та витягувати її, якщо програма запускається знову. Ця можливість нагадує механізм cookie, який використовується під час роботи з протоколом HTTP. Як ключі використовуються URL. Ці URL-адреси не обов'язково повинні посилатися на реальні ресурси. Вони лише є зручну ієрархічну схему іменування файлів.
По кожному URL-ключу програма може записати довільні двійкові дані. Обсяг запису може бути обмежений розміром блоку.
Для того щоб ізолювати програму один від одного, кожна програма повинна використовувати URL, що починається з імені сервера, що містить його код, який вказаний в JNLP-файлі. Наприклад, якщо програма завантажена з Web-сторінки http://pro-java.ru/apps, то вона може використовувати лише ключі, що мають вигляд http://pro-java.ru/apps/subkey1/subkey2/. Спроба отримати доступ до інших ключів буде свідомо невдалою.
Новий ключ створюється за допомогою методу create() класу PersistenceService:
FileConents contents = service.get(url); InputStream in = contents.getInputStream(); OutputStream out = contents.getOutputStream(true); // true = перезапис
На жаль, визначити, чи існує вказаний ключ або його потрібно створити заново, досить складно. Ми можемо лише сподіватися, що ключ існує, і викликати метод get. Якщо генерується виключення FileNotFoundException, необхідно створити новий ключ.
Починаючи з Java SE 5.0, та додаток Java Web Start, тааплети можуть виводити дані на друк, використовуючи звичайні засоби API. При цьому відображається діалогове вікно, що запитує користувача згода на доступ до принтера.
Програма, код якої наведено нижче, є модифікатором програми, що реалізує калькулятор. Цей калькулятор має віртуальну паперову стрічку, яку записуються результати всіх обчислень. Список усіх попередніх обчислень можна зберігати та зчитувати з файлу.
Для демонстрації постійного зберігання даних програма дозволяє задавати заголовок кадру. Якщо програму запустити знову, вона витягне цей заголовок із постійного сховища (див. рис.3).

От вихідний код програми: