Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

java / java-intro_part_2_ibm-developerworks

.pdf
Скачиваний:
56
Добавлен:
11.05.2015
Размер:
4.53 Mб
Скачать

02.09.13Введениев Java-программирование: Часть 2. Конструкцииреальныхприложений

java.io.Fileсодержит и другиеудобныеметоды, которыеможно использовать для удаления файлов, создания каталогов (путем передачи имени каталога в качествеаргумента в конструктор File), определения, является ли ресурс файлом, каталогом или символической ссылкой, и т.п.

Реальныедействия по вводу/выводу Java –это запись в источники и чтениеиз источников данных, и здесь-то в игру вступают потоки.

Использованиепотоков для операций ввода/вывода Java

К файлам файловой системы можно обращаться с помощью потоков. На самом низком уровнепотоки позволяют программе принимать байты из источника или направлять выводв место назначения. Некоторыепотоки обрабатывают всевиды 16битных символов (типы Readerи Writer). Другиеобрабатывают только 8-битныебайты (типы InputStreamи OutputStream). В рамках этих иерархий существует несколько разновидностей потоков, и всеони находятся в пакетеjava.io. На самом высоком уровнеабстракции находятся потоки символов и потоки байтов.

Потоки байтов считывают (InputStreamс подклассами) и записывают (OutputStream с подклассами) 8-битныебайты. Иными словами, поток байтов можно считать болеегрубым типом потока. Вот краткоеописаниедвух общих потоков байтов и способов их использования:

FileInputStream/FileOutputStream: считывает байты из файла, записывает байты в файл; ByteArrayInputStream/ByteArrayOutputStream: считывает байты из массива в памяти, записывает байты в массив в памяти.

Потокисимволов

Потоки символов считывают (Readerс подклассами) и записывают (Writerс подклассами) 16-битныесимволы. Ниже приведен перечень избранных потоков символов и способы их использования:

StringReader/StringWriter: чтениеи запись символов в строки и из строк в памяти;

InputStreamReader/InputStreamWriter(и подклассы FileReader/FileWriter): образуют мост между потоками байтов и

потоками символов. Версии Readerсчитывают байты из потока и конвертируют их в символы. Версии Writer преобразовывают символы в байты и помещают их в потоки байтов.

BufferedReader/BufferedWriter: помещают данныев буфер, считывая или записывая другой поток, что делает операции чтения и записи болееэффективными.

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

Чтение из файла

Существует несколько способов чтения из файла. Возможно, самый простой подходзаключается в следующем.

1.создать объект InputStreamReaderдля файла, из которого нужно считывать.

2.вызвать методread()и считывать по одному символу за раз до конца файла.

Пример чтения из файла приведен в листинге25.

Листинг 25. Пример чтенияиз файла.

Logger log = Logger.getAnonymousLogger(); StringBuilder sb = new StringBuilder(); try {

InputStream inputStream = new FileInputStream(new File("input.txt")); InputStreamReader reader = new InputStreamReader(inputStream);

try {

int c = reader.read(); while (c != -1) { sb.append(c);

}

} finally { reader.close();

}

} catch (IOException e) {

log.info("Caught exception while processing file: " + e.getMessage());

}

Запись в файл

Как и в случаечтения, существует несколько способов записи в файл. Опять же, я приведу самый простой подход:

www.ibm.com/developerworks/ru/edu/j-introtojava2/section10.html

2/4

02.09.13Введениев Java-программирование: Часть 2. Конструкцииреальныхприложений

1.Создать объект FileOutputStreamдля файла, в который нужно записать данные.

2.Вызвать методwrite()для записи последовательности символов.

Пример записи файла приведен в листинге26.

Листинг 26. Запись в файл

Logger log = Logger.getAnonymousLogger(); StringBuilder sb = getStringToWriteSomehow(); try {

OutputStream outputStream = new FileOutputStream(new File("output.txt")); OutputStreamWriter writer = new OutputStreamWriter(outputStream);

try { writer.write(sb.toString()); } finally {

writer.close();

}

} catch (IOException e) {

log.info("Caught exception while processing file: " + e.getMessage());

}

Потокибуферизации

Чтениеи запись потоков символов по одному символу за раз неочень эффективны, поэтому в большинствеслучаев вместо этого предпочитают использовать ввод/выводс буферизацией. Коддля чтения из файла с использованием буферизированного ввода/вывода выглядит так же, как в листинге25, за исключением того, что InputStreamReader заключается в BufferedReader, как показано в листинге27.

Листинг 27. Пример чтенияиз файла с буферизацией

Logger log = Logger.getAnonymousLogger(); StringBuilder sb = new StringBuilder(); try {

InputStream inputStream = new FileInputStream(new File("input.txt")); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); try {

String line = reader.readLine(); while (line != null) { sb.append(line);

line = reader.readLine();

}

} finally { reader.close();

}

} catch (IOException e) {

log.info("Caught exception while processing file: " + e.getMessage());

}

Запись в файл с использованием буфера ввода/вывода выполняется аналогично: OutputStreamWriterпросто заключается в BufferedWriter, как показано в листинге28.

Листинг 28. Пример записив файл с буферизацией

Logger log = Logger.getAnonymousLogger(); StringBuilder sb = getStringToWriteSomehow(); try {

OutputStream outputStream = new FileOutputStream(new File("output.txt")); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream)); try {

writer.write(sb.toString()); } finally {

writer.close();

}

} catch (IOException e) {

log.info("Caught exception while processing file: " + e.getMessage());

}

Мы всего лишь скользнули по поверхности того, что можно делать с помощью этой важной библиотеки Java. Попробуйте самостоятельно применить то, что вы узнали о файлах, к другим источникам данных.

10 из 14 | предыдущая | следующая

www.ibm.com/developerworks/ru/edu/j-introtojava2/section10.html

3/4

02.09.13Введениев Java-программирование: Часть 2. Конструкцииреальныхприложений

Печатьстраницы

Сделать этустраницуобщей

 

 

Помощь

 

Ленты

Конфиденциальность

Портал для студентов

Запрос на использование

Сообщить о нарушениях

Доступность (Английский)

Бизнес-партнеры IBM

материалов developerWorks

Условия использования

 

 

 

 

 

 

 

 

 

 

 

www.ibm.com/developerworks/ru/edu/j-introtojava2/section10.html

4/4

02.09.13Введениев Java-программирование: Часть 2. Конструкцииреальныхприложений

IBM

Русский

Войти (или Регистрация)

Техническиематериалы ПробноеПО Сообщество

Введение в Java-программирование: Часть 2. Конструкции реальных приложений

Дополнительные возможности языка Java

Дж. Стивен Перри, главный консультант, Makoto Consulting Group, Inc.

Описание: В Части 1 этого руководства профессиональный Java™-программист Дж. Стивен Перри рассказал о синтаксисе языка Java и библиотеках, требуемых для написания простых Java-приложений. Часть 2 по-прежнему ориентирована на программистов, осваивающих разработку приложений Java, и вводит болеесложныеконструкции программирования, необходимыедля построения Java-приложений, рассчитанных на практическоеприменение. Еетематика охватывает обработку исключений, наследованиеи абстракции, регулярныевыражения, родовыетипы, операции ввода/вывода Java и Java-сериализацию.

Дата: 26.10.2011

Уровеньсложности: простой

Активность: 91195 просмотров

Средний показатель рейтинга (основанный на 55 голосов)

Сериализация Java

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

Что такоесериализация объектов?

Сериализация - это процесс, когда состояниеобъекта и его метаданные(например, имя класса объекта и имена его атрибутов) сохраняются в особом двоичном формате. Преобразованиеобъекта в этот формат - сериализация - позволяет сохранить всю информацию, необходимую для восстановления (или десериализации) объекта в нужноевремя.

Существует два основных способа сериализации объекта:

Персистенция объекта - это хранениесостояния объекта в постоянном механизмеперсистенции, таком как база данных.

Дистанцирование (remoting) объекта означает передачу объекта в другой компьютер или систему.

java.io.Serializable

Первым шагом к выполнению работы по сериализации является предоставлениеобъектам возможности использовать этот механизм. Каждый объект, который нужно сериализовать, должен реализовать интерфейс java.io.Serializable:

import java.io.Serializable;

public class Person implements Serializable { // и т.д.

}

Интерфейс Serializableпомечает объекты класса Personдля среды исполнения как сериализуемые. Каждый подкласс Person такжепомечается как сериализуемый.

При попыткесериализовать объект любыенесериализуемыеатрибуты объекта вызовут выдачу средой исполнения Java исключения NotSerializableException. Этим можно управлять с помощью ключевого слова transient, котороеуказывает средевремени выполнения, что пытаться сериализовать теили иныеатрибуты ненужно. В этом случаесам программист несет ответственность за восстановлениеэтих атрибутов для правильного функционирования объекта.

Сериализацияобъекта

www.ibm.com/developerworks/ru/edu/j-introtojava2/section11.html

1/3

02.09.13Введениев Java-программирование: Часть 2. Конструкцииреальныхприложений

Теперь рассмотрим пример, в котором сочетается все, что вы только что узнали об операциях ввода/вывода Java и о сериализации.

Предположим, что мы создали и заполнили объект Manager(напомним, что Managerнаходится в графенаследования Person, который является сериализуемым объектом), а теперь хотим сериализовать этот объект в выходной поток OutputStream, в данном случае, в файл. Этот процесс показан в листинге29.

Листинг 29. Сериализацияобъекта

Manager m = new Manager(); m.setEmployeeNumber("0001");

m.setGender(Gender.FEMALE);

m.setAge(29);

m.setHeight(170); m.setName("Mary D. Boss");

m.setTaxpayerIdentificationNumber("123-45-6789");

log.info("About to write object using serialization... object looks like:"); m.printAudit(log);

try {

String filename = "Manager-" + m.hashCode() + ".ser";

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename)); oos.writeObject(m);

log.info("Wrote object..."); } catch (Exception e) {

log.log(Level.SEVERE, "Caught Exception processing object", e);

}

Первым шагом является созданиеобъекта и установка некоторых значений атрибутов. Далее, создаем выходной поток

OutputStream, в данном случаеэто FileOutputStream, а затем вызываем writeObject()для этого потока. writeObject ()- это

метод, который использует Java-сериализацию для преобразования объекта в поток.

В этом примереобъект сохраняется в файле, но для любой сериализации используется одна и та жетехнология.

Десериализацияобъекта

Весь смысл сериализации объекта заключается в том, чтобы иметь возможность впоследствии восстановить, или десериализовать его. Листинг 30 считывает только что сериализованный файл и десериализует его содержание, тем самым восстанавливая состояниеобъекта Manager.

Листинг 30. Десериализацияобъекта

Manager m = new Manager(); m.setEmployeeNumber("0001"); m.setGender(Gender.FEMALE); m.setAge(29); m.setHeight(170); m.setName("Mary D. Boss");

m.setTaxpayerIdentificationNumber("123-45-6789");

log.info("About to write object using serialization... object looks like:"); m.printAudit(log);

try {

String filename = "Manager-" + m.hashCode() + ".ser";

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename)); oos.writeObject(m);

log.info("Wrote object...");

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filename)); m = (Manager)ois.readObject();

log.info("Read object using serialization... object looks like:"); m.printAudit(log);

} catch (Exception e) {

log.log(Level.SEVERE, "Caught Exception processing object", e);

}

В большинствеслучаев маркировка объектов как сериализуемых- это все, о чем вам когда-нибудь придется беспокоиться в связи с сериализацией. В тех случаях, когда нужно явно выполнять сериализацию и десериализацию объектов, можно использовать подход, показанный в листингах 29 и 30. Но по мереразвития объектов вашего приложения и добавления/ удаления их атрибутов сериализация приобретает новый уровень сложности.

Свойство serialVersionUID

www.ibm.com/developerworks/ru/edu/j-introtojava2/section11.html

2/3

02.09.13Введениев Java-программирование: Часть 2. Конструкцииреальныхприложений

В ранниедни промежуточного ПО и удаленной связи объектов разработчики в значительной мересами отвечали за управление"форматом передачи" своих объектов, что вызывало бесконечныепроблемы по мереразвития технологии.

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

МетаданныеJava-сериализации –информация, включенная в двоичный формат сериализации, –имеют сложную структуру и решают многиепроблемы, досаждающиеранним разработчикам промежуточного ПО. Но всех проблем они тоженерешают.

При Java-сериализации используется свойство serialVersionUID, котороепомогает справиться с разными версиями объектов в сценарии сериализации. Вам ненужно декларировать это свойство для своих объектов; по умолчанию платформы Java использует алгоритм, который вычисляет его значениена основеатрибутов класса, его имени и положения в локальном кластере. В большинствеслучаев это работает отлично. Но при добавлении или удалении атрибутов это динамически сгенерированноезначениеизменится, и среда исполнения Java выдаст исключениеInvalidClassException.

Чтобы избежать этого, нужно взять в привычку явноеобъявлениеserialVersionUID:

import java.io.Serializable;

public class Person implements Serializable {

private static final long serialVersionUID = 20100515; // и т.д.

}

Ярекомендую использовать некую схему для номера версии serialVersionUID(в примерея использую текущую дату), причем нужно объявить его как private static finalс типом long.

Вы можетеспросить, когда изменять это свойство? Краткий ответ заключается в том, что его нужно изменять его всякий раз при внесении несовместимых изменений в класс, что обычно означает, что вы удалили атрибут. Если на компьютереимеется версия объекта, в которой атрибут удален, и этот объект переносится на машину с версией объекта, в которой этот атрибут ожидается, могут произойти неприятности.

В качествезолотого правила, при каждом добавлении или удалении элементов класса (то есть атрибутов и методов) нужно изменять его serialVersionUID. Лучшеполучить исключениеInvalidClassExceptionна другом конце"провода", чем приложениес ошибкой из-за несовместимых изменений класса.

11 из 14 | предыдущая | следующая

Печатьстраницы

Сделать этустраницуобщей

 

 

Помощь

 

Ленты

Конфиденциальность

Портал для студентов

Запрос на использование

Сообщить о нарушениях

Доступность (Английский)

Бизнес-партнеры IBM

материалов developerWorks

Условия использования

 

 

 

 

 

 

 

 

 

 

 

www.ibm.com/developerworks/ru/edu/j-introtojava2/section11.html

3/3

02.09.13Введениев Java-программирование: Часть 2. Конструкцииреальныхприложений

IBM

Русский

Войти (или Регистрация)

Техническиематериалы ПробноеПО Сообщество

Введение в Java-программирование: Часть 2. Конструкции реальных приложений

Дополнительные возможности языка Java

Дж. Стивен Перри, главный консультант, Makoto Consulting Group, Inc.

Описание: В Части 1 этого руководства профессиональный Java™-программист Дж. Стивен Перри рассказал о синтаксисе языка Java и библиотеках, требуемых для написания простых Java-приложений. Часть 2 по-прежнему ориентирована на программистов, осваивающих разработку приложений Java, и вводит болеесложныеконструкции программирования, необходимыедля построения Java-приложений, рассчитанных на практическоеприменение. Еетематика охватывает обработку исключений, наследованиеи абстракции, регулярныевыражения, родовыетипы, операции ввода/вывода Java и Java-сериализацию.

Дата: 26.10.2011

Уровеньсложности: простой

Активность: 91195 просмотров

Средний показатель рейтинга (основанный на 55 голосов)

Заключениек Части 2

Руководство "Введениев Java-программирование" охватило значительную часть языка Java, но этот язык огромен. В одном руководственельзя объять все.

Продолжая изучать язык и платформу Java, вы, вероятно, захотитеуглубиться в такиетемы, как регулярныевыражения, родовыетипы и Java-сериализация. Со временем, возможно, вам придется изучить темы, вообщенерассматриваемыев этом вводном руководстве, например, параллелизм и персистентность. Ещеодна тема, достойная изучения, это версия Java 7, которая внесет в платформу Java много новаторских изменений. В разделеРесурсы указаны хорошиеотправныеточки для получения дополнительной информации о концепциях Java-программирования, в том числетех, которыеслишком сложны для изучения в этом вводном формате.

12 из 14 | предыдущая | следующая

Печатьстраницы

Сделать этустраницуобщей

 

 

Помощь

 

Ленты

Конфиденциальность

Портал для студентов

Запрос на использование

Сообщить о нарушениях

Доступность (Английский)

Бизнес-партнеры IBM

материалов developerWorks

Условия использования

 

 

 

 

 

 

 

 

 

 

 

www.ibm.com/developerworks/ru/edu/j-introtojava2/section12.html

1/1

02.09.13Введениев Java-программирование: Часть 2. Конструкцииреальныхприложений

IBM

Русский

Войти (или Регистрация)

Техническиематериалы ПробноеПО Сообщество

Введение в Java-программирование: Часть 2. Конструкции реальных приложений

Дополнительные возможности языка Java

Дж. Стивен Перри, главный консультант, Makoto Consulting Group, Inc.

Описание: В Части 1 этого руководства профессиональный Java™-программист Дж. Стивен Перри рассказал о синтаксисе языка Java и библиотеках, требуемых для написания простых Java-приложений. Часть 2 по-прежнему ориентирована на программистов, осваивающих разработку приложений Java, и вводит болеесложныеконструкции программирования, необходимыедля построения Java-приложений, рассчитанных на практическоеприменение. Еетематика охватывает обработку исключений, наследованиеи абстракции, регулярныевыражения, родовыетипы, операции ввода/вывода Java и Java-сериализацию.

Дата: 26.10.2011

Уровеньсложности: простой

Активность: 91195 просмотров

Средний показатель рейтинга (основанный на 55 голосов)

Ресурсы

Научиться

Оригинал статьи(EN)

Страница Java-технологии: официальный сайт Java содержит ссылки на все, что связано с платформой Java, включая спецификацию языка Java и документацию API Java .(EN)

Java 6: подробнеео JDK 6 и содержащихся в нем инструментах.

Страница Javadoc: о тонкостях использования Javadoc, в том числео том, как применять инструмент командной строки и как написать свои собственныедоклеты, которыепозволяют создавать специальныеформаты документации.

Новоев Java-технологии: сборник ресурсов developerWorks для начинающих Java-разработчиков.

5 вещей, которые вы не знали о ...: серия статей developerWorks, которая знакомит с менееизвестными (но часто полезными) рекомендациями и сведениями по Java-программированию.

Try to catch me: Does exception handling impair performance?(Tony Sintes, JavaWorld, июль 2001 г.): статья, содержащая вводную информацию по обработкеисключений в Java-программах.(EN)

Exception: Don't get thrown for a loss (Tony Sintes, JavaWorld, февраль 2002 г.): почувствуйтеразницу между контролируемыми исключениями и исключениями времени выполнения

Regular expressions simplify pattern-matching code(Jeff Friesen, JavaWorld.com, февраль 2003 г.): расширенноевведениев

регулярныевыражения.(EN)

Diagnosing Java code: Java generics without thepain, Part 1 (Eric Allen, DeveloperWorks, февраль 2003 г.): первая часть серии статей, посвященных введению в синтаксис родовых типов Java

Refactoring: Improving the Design of Existing Code (Martin Fowler et al., издательство Addison-Wesley, 1999 г.):

превосходный учебник по написанию четкого, удобного в обслуживании кода.(EN)

Design patterns: Elements of reusable object-oriented software (Erich Gammaet др., издательство Addison-Wesley, 1994 г.):

подробнеео модели Factory, одной из 23 моделей проектирования, которыеопределяют современный подходк разработкепрограммного обеспечения.

www.ibm.com/developerworks/ru/edu/j-introtojava2/resources.html

1/2

02.09.13Введениев Java-программирование: Часть 2. Конструкцииреальныхприложений

Получитьпродукты итехнологии

JDK 6: загрузитеJDK 6 от Sun (Oracle).

Eclipse: загрузитеIDE Eclipseдля Java-разработчиков.

Комплекты разработчика IBM : IBM предоставляет рядкомплектов Java-разработчика для популярных платформ.(EN)

13 из 14 | предыдущая | следующая

Печатьстраницы

Сделать этустраницуобщей

 

 

Помощь

 

Ленты

Конфиденциальность

Портал для студентов

Запрос на использование

Сообщить о нарушениях

Доступность (Английский)

Бизнес-партнеры IBM

материалов developerWorks

Условия использования

 

 

 

 

 

 

 

 

 

 

 

www.ibm.com/developerworks/ru/edu/j-introtojava2/resources.html

2/2

02.09.13Введениев Java-программирование: Часть 2. Конструкцииреальныхприложений

IBM

Русский

Войти (или Регистрация)

Техническиематериалы ПробноеПО Сообщество

Введение в Java-программирование: Часть 2. Конструкции реальных приложений

Дополнительные возможности языка Java

Дж. Стивен Перри, главный консультант, Makoto Consulting Group, Inc.

Описание: В Части 1 этого руководства профессиональный Java™-программист Дж. Стивен Перри рассказал о синтаксисе языка Java и библиотеках, требуемых для написания простых Java-приложений. Часть 2 по-прежнему ориентирована на программистов, осваивающих разработку приложений Java, и вводит болеесложныеконструкции программирования, необходимыедля построения Java-приложений, рассчитанных на практическоеприменение. Еетематика охватывает обработку исключений, наследованиеи абстракции, регулярныевыражения, родовыетипы, операции ввода/вывода Java и Java-сериализацию.

Дата: 26.10.2011

Уровеньсложности: простой

Активность: 91195 просмотров

Средний показатель рейтинга (основанный на 55 голосов)

Об авторе

Дж. Стивен Перри (J. Steven Perry) –независимый консультант по вопросам разработки программного обеспечения, профессионально занимающийся созданием ПО с 1991 г. Стив увлекается программированием, получает удовольствиеот написания статей и книг на эту тему, а такжеот консультирования других разработчиков. Он является автором книг Java Management Extensions и Log4j (обекниги выпущены издательством O'Reilly) и статьи Время Йоды, опубликованной на сайте IBM developerWorks. Своесвободноевремя он проводит с тремя детьми, катается на велосипедеи преподает йогу. Стив является владельцем и главным консультантом компании Makoto Consulting Group, расположенной в городеЛиттл Рок, штат Арканзас.

14 из 14 | предыдущая

Печатьстраницы

Сделать этустраницуобщей

 

 

Помощь

 

Ленты

Конфиденциальность

Портал для студентов

Запрос на использование

Сообщить о нарушениях

Доступность (Английский)

Бизнес-партнеры IBM

материалов developerWorks

Условия использования

 

 

 

 

 

 

 

 

 

 

 

www.ibm.com/developerworks/ru/edu/j-introtojava2/authors.html

1/1

Соседние файлы в папке java