Статьи
YouTube-канал
Отзывы

Статьи с тэгом «Java»

Подсчёт количества строк в текстовом файле

23 марта 2021

Тэги: Java 11, Java, алгоритмы, файлы.

Во многих редакторах при работе с текстовым документом вы можете видеть, сколько всего строк содержится в этом файле. Строки между собой разделяются символом перевода строки, который в каждой операционной системе (Windows, Unix, Mac) свой.

Давайте разберёмся, как быстро подсчитать количество строк в текстовом файле независимо от той ОС, в котором выполняется наш код. Более того, текстовый файл может быть сколь угодно большим, поэтому мы будем использовать буферизацию потока, чтобы не израсходовать всю доступную оперативную память.

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

Читать полностью...

Проверка вложенности скобок

22 марта 2021

Тэги: Java, алгоритмы, головоломки, Java 8.

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

Зачем нужно проверять вложенность скобок

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

Первое, что приходит в голову, это подсчитать количество открывающих и количество закрывающих скобок в строке и если эти числа равны, то считать, что последовательность скобок правильная. Возможно, это и будет работать в самых простых случаях, однако последовательность «(())» будет правильной, а последовательность «())(» - неправильной. При этом количество открывающих и закрывающих скобок у них одинаковы. Кроме того, скобки могут быть разных типов (круглая, фигурная, квадратная и т.п.) и скобки должны соответствовать ещё и по типу. Поэтому в основе такой проверки должна лежать работа со стеком.

Читать полностью...

Вычисление контрольной суммы файла

21 марта 2021

Тэги: Java 11, алгоритмы, Java, файлы.

Контрольная сумма от набора байт позволяет убедиться в том, что данные на клиенте, полученные от сервера, являются корректными. Для этого вместе с файлом сервер может предоставлять контрольную сумму для проверки на клиентской стороне. Существует несколько алгоритмов вычисления контрольной суммы, рассмотрим самые популярные: md5, sha-256, sha-512 и crc-32.

Вычисление md5 с помощью MessageDigest

В пакете java.security есть такой класс как MessageDigest. Он позволяет получить одну из встроенных реализаций алгоритма вычисления контрольных сумм. Поэтому сначала реализуем метод, который абстрагирован от конкретного алгоритма и работает с любым MessageDigest одинаково.

Читать полностью...

Что нового в Java 16

16 марта 2021

Тэги: Java, Java 16, Stream API, Collections, maven, новости.

Сегодня, 16 марта 2021 года, состоялся релиз новой версии Java 16. Давайте рассмотрим новые конструкции языка, которые в предыдущих версиях находились в статусе preview, а теперь доступны «из коробки» без каких-либо дополнительных настроек.

Установка

Для установки openjdk версии 16 через apt на Ubuntu-подобные системы можно выполнить следующие команды:

sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt update
sudo apt search openjdk
sudo apt install openjdk-16-jdk

Если у вас проект на maven, то для успешной сборки с новой версией Java добавьте в pom.xml следующие параметры:

<properties>
    <maven.compiler.source>16</maven.compiler.source>
    <maven.compiler.target>16</maven.compiler.target>
</properties>

Теперь можно перейти к обзору новых фич.

Читать полностью...

Как получить последний день месяца

30 сентября 2020

Тэги: Java, Java 8, Kotlin, алгоритмы.

При работе с датами часто бывает нужно получить последний день текущего месяца или года. Поскольку последний день года всегда равен 31 декабря, то мы можем напрямую создать эту дату с помощью метода LocalDate.of(). А вот последний день месяца зависит от конкретного месяца. Дней в месяце может быть 30 или 31, а для февраля и вовсе 28 или 29.

Чтобы не разбираться в логике работы календаря, начиная с Java 8 (а, значит, и в Kotlin) нам доступен специальный класс TemporalAdjusters. Он имеет несколько полезных методов, но в данном случае нас интересует lastDayOfMonth(), возвращающий специальный объект с интерфейсом TemporalAdjuster. Этот интерфейс содержит метод adjustInto(), который позволяет «выравнивать» любую переданную ему дату (или дату со временем) по определённому правилу. В нашем случае дата будет выровнена по последнему дню месяца.

Читать полностью...

Работа с коллекциями в Kotlin и Java

28 сентября 2020

Тэги: Kotlin, Java, Collections, Java 11, Stream API.

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

Создаём класс-сущность

Для того, чтобы нам было от чего отталкиваться, создадим класс-сущность. То есть это класс, предназначенный для хранения данных. Часто в корпоративных приложениях поля таких классов мапятся один к одному на поля таблицы в базе данных. Для примера рассмотрим сущность «Город», у которой есть два атрибута: название и количество проживающих в нём людей.

Читать полностью...

Сравнение форматов конфига в Spring Boot

16 февраля 2020

Тэги: Spring Boot, Java, Collections, Spring, XML, json, yaml.

Spring Boot позволяет хранить настройки приложения в файле и получать к ним доступ в декларативном стиле. Этот файл может иметь один из трёх форматов: properties, xml и yaml. Как Spring будет интерпретировать формат файла, определяется его расширением. Далее мы рассмотрим плюсы и минусы каждого формата. В качестве примера предположим, что в конфиге мы храним число, текстовую строку на русском языке и список значений.

properties-файл

По умолчанию в Spring используется properties-конфиг. Имя файла должно начинаться со слова application и иметь расширение properties. Если вы не используете профили для разделения конфигов, то достаточно иметь файл application.properties.

# числовой параметр
some.test.numberValue=42
# текстовый параметр
some.test.textValue="Текстовый параметр из properties-файла"
# список значений
some.test.list[0]=one
some.test.list[1]=two
some.test.list[2]=three

В данном формате комментарии всегда начинаются с новой строки и с символа «#». Имя каждого параметра прописывается полностью (и это один из недостатков данного формата), затем идёт «=», затем само значение. Текстовые значения можно указывать как в кавычках, так и без них. Список значений, который в нашем приложении превратится в объект типа List, в конце имени каждого значения имеет индекс в квадратных скобках. Такой синтаксис похож на объявление массива.

Читать полностью...

Сохранение данных в формате Excel

9 февраля 2020

Тэги: Java 10, файлы, Java, Excel, Apache.

Ранее мы рассматривали пример на тему Чтение данных из Excel. А сегодня узнаем, как можно сохранять данные в формате Excel. Для работы нам потребуются всё те же зависимости от Apache POI. Пример проекта на github прилагается.

Читать полностью...

Распаковка zip-архивов

29 января 2020

Тэги: Java 10, файлы, Java.

Ранее мы рассматривали Создание zip-архивов, а теперь попробуем выполнить обратную операцию. Если у нас имеется zip-архив с файлами, то распаковать его мы можем следующим образом:

public static void main(String[] args) throws IOException {
    try (var file = new ZipFile("/home/devmark/Documents/test.zip")) {
        var entries = file.entries();
        var uncompressedDirectory = new File(file.getName()).getParent() + File.separator;
        while (entries.hasMoreElements()) {
            var entry = entries.nextElement();
            if (entry.isDirectory()) {
                processDirectory(uncompressedDirectory, entry);
            } else {
                processFile(file, uncompressedDirectory, entry);
            }
        }
    }
}

Мы создаём объект ZipFile из пакета java.util, в конструктор которому передаём полный путь до нашего архива. Все действия выполняем в конструкции try-with-resources, которая автоматически закроет ресурс, связанный с нашим архивом, в конце работы с ним.

Читать полностью...

Создание zip-архивов

27 января 2020

Тэги: Java 10, файлы, Java.

Если нам нужно упаковать в zip-архив какую-то папку с файлами, то сделать это можно следующим образом:

public static void main(String[] args) throws IOException {
    var fileToZip = new File("/home/devmark/Documents/test-dir");
    try (
            var fos = new FileOutputStream(fileToZip.getAbsolutePath() + ".zip");
            var zipOut = new ZipOutputStream(fos)
    ) {
        zipFile(fileToZip, fileToZip.getName(), zipOut);
    }
}

Тут мы создаём объект File с полным путём до папки. Затем используем конструкцию try-with-resources для создания потоков вывода, которая автоматически закрывает эти потоки при выходе из блока. Мы сначала создаём файловый поток вывода FileOutputStream для записи файла с архивом, затем «обрачиваем» его потоком ZipOutputStream, который как раз и позволяет нам архивировать содержимое. По завершении работы программы zip-архив будет лежать на одном уровне с исходной директорией, называться он будет так же, только с расширением «.zip». Теперь рассмотрим метод zipFile().

Читать полностью...

❮ Назад Далее ❯