Месяц: Февраль 2013

  • Java. Примеры копирования файлов. Эволюция и революция.

    Задачка копирование файлов в свое время была хорошим тестом для программистов.

    1. Streams.

    До появления пакета NIO (New I/O, версия Java 1.4) многие использовали обычные потоки.

        public static void copy(File source, File dest) throws IOException {
            FileInputStream is = new FileInputStream(source);
            try {
                FileOutputStream os = new FileOutputStream(dest);
                try {
                    byte[] buffer = new byte[4096];
                    int length;
                    while ((length = is.read(buffer)) > 0) {
                        os.write(buffer, 0, length);
                    }
                } finally {
                    os.close();
                }
            } finally {
                is.close();
            }
        }
    

    2. New I/O

    В 2000-ном году появился пакет java.nio. Акроним NIO означает New I/O (новый ввод/ввывод). Отчасти я согласен с мнением, что название было выбрано не очень удачным, т.к. не сложно было предположить, что пройдет время и будет нелепо называть новым пакет 12-летней давности.

    С помощью NIO копирование файлов смотрелось более изящно, решение эволюционировало следующим образом:

        public static void copy(File source, File dest) throws IOException {
            FileChannel sourceChannel = new FileInputStream(source).getChannel();
            try {
                FileChannel destChannel = new FileOutputStream(dest).getChannel();
                try {
                    destChannel.transferFrom(sourceChannel, 0, sourceChannel.size());
                } finally {
                    destChannel.close();
                }
            } finally {
                sourceChannel.close();
            }
        }
    

    Легко видеть, что здесь мы избавились от цикла, используем “новое” API и сократилось количество кода.

    3. Apache Commons IO.

    Тем не менее, многих ленивых программистов такое развитие не особо впечатлило и те кто знал, продолжил использовать Apache Commons IO.

        public static void copy(File source, File dest) throws IOException {
            FileUtils.copyFile(source, dest);
        }
    

    Единственным неудобством была необходимость в дополнительной сторонней библиотеке. Тем не менее, поскольку библиотека предоставляла программистам еще много другого удобного API для работы с I/O, по моим наблюдениям файл commons-io-*.jar стал присутствовать во многих крупных проектов того времени.

    4. Java 7.

    Революция произошла с выходом Java 7, релиз который был сделан уже Oracle, а не Sun Microsystems.
    Появился класс Files, с помощью которого копирование файлов стало не намного сложнее чем commons-io:

        public static void copy(File source, File dest) throws IOException {
            Files.copy(source.toPath(), dest.toPath());
        }
    

    При этом не нужно прописывать в мавене дополнительную зависимость.

    Понятно, что это доступно только для Java 7 и предыдущие ее версии во всю используются многими компаниями. Тем не менее, в связи с недавней новостью о том, что Oracle выпустил недавно свое последнее публичное обновление для Java 6, возможно многие все-таки будут постепенно переползать на семерку.

  • Сколько стоит талант программиста (и не только).

    gold
    Фото с wikipedia

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

    Прежде чем начать изложение, хотел сообщить, что я осознаю всю нестрогость моих расчетов и надеюсь никто не станет воспринимать приведенные ниже доводы буквально!

    Теперь можно приступать.

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

    Талант, в современном понимании, это определённые способности, которые раскрываются с приобретением навыка и опыта. Поиск источника такого толкования этого слова приведет нас к притче о талантах.

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

    Один приумножил, второй разменял, а третий закопал свой талант в землю. Того, кто закопал, хозяин отругал, других похвалил и наградил. Мораль — закапывать свой талант плохо, приумножать — хорошо.

    Недавно мне стало интересно, а сколько именно было закопано? Немного покопавшись в интернете нашел приближенные исходные данные и произвел следующий расчет.
    (далее…)

  • Java Security Update (Java 7u13)

    Вышло долгожданное обновление Java!

    Java
    Oracle выпустил релиз даже раньше запланированного срока (изначально должен был выйти 19 февраля 2013г).
    В анонсе сказано, что обновление содержит 50 исправлений безопасности:

    Due to the threat posed by a successful attack, Oracle strongly recommends that customers apply CPU fixes as soon as possible. This Critical Patch Update contains 50 new security fixes across Java SE products.

    Как обычно, обновление можно скачать с сайта java.com (JRE) или с сайта oracle.com (JDK, JRE и все остальное).