Продолжаю вести практикум по программированию на Java и Scala.

Сегодня было четвертое занятие. Я уже стал многих студентов узнавать в лицо. В среднем на занятия приходит около 25 человек. Аудиторию нам дали хорошую, есть проектор, и вроде неплохие компьютеры. На них уже был установлен Eclipse  или NetBeans. Правда все равно студентов больше чем компьютеров, так что многим приходится работать в лучших традициях eXtreme Programming -- вдвоем, а иногда и втроем за одним компьютером.  Некоторые приносят свои ноутбуком, что сильно спасает ситуацию.

Как-то упустил из виду процесс согласования программы, предварительно договаривались о семестровом двухпарном или годовом однопарном, а в итоге получился семестровый однопарный. Так что приходится сильно стараться чтобы уложится в семестр. Из теории стараюсь передать самую суть и больше времени уделить практическим занятиям. Во-первых сам курс называется "практикум", а во-вторых теорию можно узнать из документации, спецификаций и разных книжек, а вот так чтобы в режиме реального времени написать/запустить/спросить почему не работает/узнать где и что не так,  можно далеко не везде и не всегда. Разве что на работе, но там как правило более жесткий и циничный подход к людям.

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

Думаю вернусь к этой теме еще раз, как-нибудь между делом. Нужно подобрать примеры из жизни по наглядней.

Сегодня рассказывал про ввод-вывод (java.io). NIO трогать не стал, только путать. Для наглядности, показал картинку из матрицы и сказал, что поток (stream) - это как поток воды, только из байт.

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

С помощью OutputStream, а точнее FileOutputStream записали строку "hello world" в файл. Затем получили содержимое этого файла.

Потом скопировали содержимое одного файла в другой.

Потом я попросил сделать копирования файлов с использованием буфера - массива байт

(т.е. создаем byte[] buff = new byte[LENGTH], и через is.read(buff) и os.write(buff,0,length) копируем в цикле весь файл).

Потом рассказал  про BufferedInputStream и BufferedOutputStream...

Затем мы использовали ZipOutputStream и сделали zip-архив.

Я очень хотел на этих примерах раскрыть ООП-ность подхода работы с потоками -- есть абстрактный класс OutputStream и много разных его реализаций, которые и в файл записывать могут, и в массив байт, и буферизовывать вывод, и даже шифровать.

Вот здесь произошла небольшая заминка,  т.к. планировал рассказать как использовать CipherOutputStream и зашифровать что-нибудь на основе password-based encryption. Но как оказалось времени осталось мало и не хотелось грузить такой сложной информацией (а Серж например вообще настоятельно рекомендовал не показывать эти слайды, чтобы не пугать людей). В общем мы приступили к обработке исключений, поскольку они при работе с IO возникают везде, да и в принципе нужно знать что это такое.

Я показал что такое try,catch, throws, finally. Рассмотрели простые примеры. Затем рассказал про Throwable, Exception, Error, RuntimeException. Кто от кого наследуется и для кого нужно указывать throws.

Исключения студентам понравились, боюсь как бы они не стали использовать не в тех местах (то есть повсюду)... Надо будет в следующий раз рассказать о "темной стороне" работы с ними.

На следующем занятии начну работу с сетью. Задача минимум - URL, сокеты,  а так может еще запустим Tomcat, расскажу про Reader/Writer, сделаем простенький сервлет. Потом останется рассказать про базы данных и всякие интересный плюшки типа GWT (хотя сейчас думаю что может и не стоит об этой Google-овой технологии рассказывать), а затем Scala! Вот тут начнется самое интересное - паттерн_матчинг, миксинги, перегрузка операторов...