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

PR1.Tyutterin_Yakov_Z1411

.pdf
Скачиваний:
0
Добавлен:
07.01.2025
Размер:
989.12 Кб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ федеральное государственное автономное образовательное учреждение высшего образования

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

ИНСТИТУТ НЕПРЕРЫВНОГО И ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ

КАФЕДРА ПРИКЛАДНОЙ ИНФОРМАТИКИ

ОЦЕНКА

ПРЕПОДАВАТЕЛЬ

Канд. техн. наук

 

С. А. Чернышев

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЕТ О ПРАКТИЧЕСКОЙ РАБОТЕ №1

Асинхронное программирование

по дисциплине: Технологии программирования

РАБОТУ ВЫПОЛНИЛ

 

 

 

 

 

СТУДЕНТ гр. №

Z1411

 

 

Я. Н. Тюттерин

 

 

 

 

 

 

 

номер группы

подпись, дата

 

инициалы, фамилия

Студенческий билет №

2022/4886

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Санкт-Петербург 2024

Практическая работа № 1. Асинхронное программирование

Цель работы: познакомиться с основными способами работы с процессами.

Вариант 18.

Задание 9: Напишите асинхронное приложение для анализа текстовых данных, которое параллельно обрабатывает текстовые файлы, вычисляя статистические данные, такие как: частота слов или распределение символов.

import java.io.File; import java.io.IOException;

import java.nio.charset.StandardCharsets; import java.nio.file.Files;

import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;

import java.util.concurrent.CompletableFuture; public class TextAnalyzer {

public static void main(String[] args) {

final File[] files = new File("src/resources").listFiles(); if (files == null) {

return;

}

final List<CompletableFuture<Result>> completableFutures = new ArrayList<>(files.length);

for (File file : files) { completableFutures.add(run(file));

}

completableFutures.parallelStream().forEach(f -> { final Result result = f.join();

System.out.printf("File: %s\n Character Frequency: %s\n Word Frequency: %s\n", result.fileName,

result.charFrequency, result.wordFrequency);

});

}

public static CompletableFuture<Result> run(File file) { return CompletableFuture.supplyAsync(() -> {

try {

return Files.newBufferedReader(file.toPath(), StandardCharsets.UTF_8);

} catch (IOException e) {

throw new RuntimeException(e);

}

}).thenApplyAsync(br -> { try {

final Map<Character, Integer> charFrequency = new

HashMap<>();

final Map<String, Integer> wordFrequency = new HashMap<>(); String line;

while ((line = br.readLine()) != null) {

final StringBuilder tmp = new StringBuilder(); final char[] charArray = line.toCharArray(); final int count = charArray.length - 1;

for (int i = 0; i <= count; i++) { char curr = charArray[i];

charArray[i] = Character.isUpperCase(curr) ? (curr = Character.toLowerCase(curr)) : curr;

charFrequency.merge(curr, 1, Integer::sum); if (Character.isAlphabetic(curr)) {

tmp.append(curr);

}

if (!Character.isAlphabetic(curr) || i == count) { if (!tmp.isEmpty()) {

wordFrequency.merge(tmp.toString(), 1,

Integer::sum);

tmp.delete(0, tmp.length());

}

}

}

}

br.close();

return new Result(charFrequency, wordFrequency,

file.getName());

} catch (IOException ex) {

throw new RuntimeException(ex);

}

});

}

public record Result(Map<Character, Integer> charFrequency, Map<String, Integer> wordFrequency, String fileName) {

}

}

Рисунок 1 - Результат выполнения

Утилитарный класс для тестов, синхронно анализирующий файл.

Рисунок 2 - Утилитарный класс

Рисунок 3 - Класс с тестами(1/2)

Рисунок 4 - Класс с тестами (2/2)

Задание 15. Напишите асинхронное приложение, которое асинхронно удаляет все файлы в целевой директории, созданные более чем N дней назад

import java.io.File; import java.io.IOException; import java.nio.file.Files;

import java.nio.file.attribute.BasicFileAttributeView; import java.time.Instant;

import java.time.temporal.ChronoUnit; import java.util.LinkedList;

import java.util.List;

import java.util.concurrent.CompletableFuture;

public class FileDeleter {

public static void main(String[] args) {

final File[] files = new File("src/resources").listFiles(); if (files == null) {

return;

}

final List<CompletableFuture<Void>> completableFutures = new LinkedList<>();

for (File file : files) { completableFutures.add(run(file, 1));

}

completableFutures.parallelStream().forEach(CompletableFuture::join);

}

public static CompletableFuture<Void> run(File file, int days) { return CompletableFuture.runAsync(() -> {

try {

final BasicFileAttributeView fileAttributeView =

Files.getFileAttributeView(file.toPath(),

BasicFileAttributeView.class);

final Instant created = fileAttributeView.readAttributes().creationTime().toInstant();

if (created.isBefore(Instant.now().minus(days, ChronoUnit.DAYS))) {

file.delete();

}

} catch (IOException e) {

throw new RuntimeException(e);

}

});

}

}

Класс с тестами для тестирования функциональности класса FileDeleter.

import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test;

import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path;

import java.nio.file.attribute.BasicFileAttributeView; import java.nio.file.attribute.FileTime;

import java.time.LocalDateTime; import java.time.ZoneOffset; import java.util.Arrays; import java.util.UUID;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class FileDeleterTest {

@BeforeEach void init() {

final File[] files = new File("resources/").listFiles(); Arrays.stream(files).forEach(File::delete);

}

@Test

void testDeleteFile() throws IOException { generatedFilesToDelete(20, 1);

final File[] files = new File("resources/").listFiles(); for (File file : files) {

FileDeleter.run(file, 1).join();

}

final int actual = new File("resources/").listFiles().length; assertEquals(0, actual);

}

public static void generatedFilesToDelete(int count, int days) throws IOException {

for (int i = 0; i < count; i++) {

final Path path = Path.of("resources/", UUID.randomUUID() +

".txt");

final File file = new File(path.toString()); file.createNewFile();

final BasicFileAttributeView attributes = Files.getFileAttributeView(path, BasicFileAttributeView.class);

final FileTime time = FileTime.fromMillis(LocalDateTime.now().minusDays(days).toEpochSecond(ZoneOff set.UTC));

attributes.setTimes(time, time, time); Files.setAttribute(path, "creationTime", time);

}

}

}

Соседние файлы в предмете Технологии программирования