Изучаем Java EE 7 - [10]

Шрифт
Интервал


Листинг 1.7. Объявление дженериков

>// Без ромбовидного оператора

>List list = new ArrayList();

>Map, Map>> map =

>····new HashMap, Map>>();


>// C ромбовидным оператором

>List list = new ArrayList<>();

>Map, Map>> map = new HashMap<>();

Конструкция try-with-resources

В некоторых Java API закрытием ресурсов необходимо управлять вручную, обычно с помощью метода close в блоке finally. Это касается ресурсов, управляемых операционной системой, например файлов, сокетов или соединений интерфейса JDBC. Листинг 1.8 показывает, как необходимо ставить закрывающий код в блоке finally с обработкой исключений, но удобочитаемость кода из-за этого снижается.


Листинг 1.8. Закрытие входных/выходных потоков в блоках Finally

>try {

>··InputStream input = new FileInputStream(in.txt);

>··try {

>····OutputStream output = new FileOutputStream(out.txt);

>····try {

>······byte[] buf = new byte[1024];

>······int len;

>······while ((len = input.read(buf)) >= 0)

>······output.write(buf, 0, len);

>····} finally {

>······output.close();

>····}

>··} finally {

>····input.close();

>··}

>} catch (IOException e) {

>··e.printStrackTrace();

>}

Конструкция try-with-resources решает проблему читаемости с помощью нового, более простого синтаксиса. Это позволяет ресурсам в блоке try автоматически высвобождаться в его конце. Нотация, описанная в листинге 1.9, может использоваться для любого класса, реализующего новый интерфейс java.lang.AutoCloseable. Сейчас он реализуется множеством классов (InputStream, OutputStream, JarFile, Reader, Writer, Socket, ZipFile) и интерфейсов (java.sql.ResultSet).


Листинг 1.9. Закрытие входных/выходных потоков с помощью конструкции try-with-resources

>try (InputStream input = new FileInputStream(in.txt);

>·····OutputStream output = new FileOutputStream(out.txt)) {

>··byte[] buf = new byte[1024];

>··int len;

>··while ((len = input.read(buf)) >= 0)

>····output.write(buf, 0, len);

>} catch (IOException e) {

>··e.printStrackTrace();

>}

Multicatch-исключения

До появления Java SE 6 блок захвата мог обрабатывать только одно исключение в каждый момент времени. Поэтому приходилось накапливать несколько исключений, чтобы потом применить нужное действие для обработки исключений каждого типа. И как показано в листинге 1.10, для каждого исключения зачастую необходимо выполнять одно и то же действие.


Листинг 1.10. Использование нескольких конструкций для захвата исключений

>try {

>··// Какое-либо действие

>} catch(SAXException e) {

>··e.printStackTrace();

>} catch(IOException e) {

>··e.printStackTrace();

>} catch(ParserConfigurationException e) {

>··e.printStackTrace();

>}

Если разные исключения требуют одинаковой обработки, в Java SE 7 вы можете добавить столько типов исключений, сколько нужно, разделив их прямым слешем, как показано в листинге 1.11.


Листинг 1.11. Использование Multicatch-исключения

>try {

>··// Какое-либо действие

>} catch(SAXException | IOException | ParserConfigurationException e) {

>··e.printStackTrace();

>}

NIO.2

Если вам, как и многим Java-разработчикам, с трудом удается читать или записывать некоторые файлы, вы оцените новую возможность Java SE 7: пакет ввода/вывода java.nio. Этот пакет, обладающий более выразительным синтаксисом, призван заменить существующий пакет java.io, чтобы обеспечить:

• более аккуратную обработку исключений;

• полный доступ к файловой системе с новыми возможностями (поддержка атрибутов конкретной операционной системы, символических ссылок и т. д.);

• добавление понятий FileSystem и FileStore (например, возможность разметки диска);

• вспомогательные методы (перемещение/копирование файлов, чтение/запись бинарных или текстовых файлов, путей, каталогов и т. д.).

В листинге 1.12 показан новый интерфейс java.nio.file.Path (используется для определения файла или каталога в файловой системе), а также утилитный класс java.nio.file.Files (применяется для получения информации о файле или манипулирования им). Начиная с Java SE 7 рекомендуется использовать новый NIO.2, даже пока старый пакет java.io не вышел из употребления. В листинге 1.12 код получает информацию о файле source.txt, копирует его в файл dest.txt, отображает его содержимое и удаляет его.


Листинг 1.12. Использование нового пакета ввода/вывода

>Path path = Paths.get("source.txt");

>boolean exists = Files.exists(path);

>boolean isDirectory = Files.isDirectory(path);

>boolean isExecutable = Files.isExecutable(path);

>boolean isHidden = Files.isHidden(path);

>boolean isReadable = Files.isReadable(path);

>boolean isRegularFile = Files.isRegularFile(path);

>boolean isWritable = Files.isWritable(path);

>long size = Files.size(path);

>// Копирует файл

>Files.copy(Paths.get("source.txt"), Paths.get("dest.txt"));

>// Считывает текстовый файл

>List lines = Files.readAllLines(Paths.get("source.txt"), UTF_8);

>for (String line: lines) {

>··System.out.println(line);

>}

>// Удаляет файл

>Files.delete(path);

Обзор спецификаций Java EE

Java EE — это обобщающая спецификация, которая объединяет и интегрирует остальные. На сегодняшний день для обеспечения совместимости с Java EE 7 сервер приложений должен реализовывать 31 спецификацию, а разработчику для оптимального использования контейнера необходимо знать тысячи API. Несмотря на то что требуется знать столько спецификаций и API, основная цель Java EE 7 — упростить платформу, предоставив несложную модель, основанную на POJO, веб-профиле и отсечении некоторых неактуальных технологий.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.