
PR1.Tyutterin_Yakov_Z1411
.pdf
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
ИНСТИТУТ НЕПРЕРЫВНОГО И ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ
КАФЕДРА ПРИКЛАДНОЙ ИНФОРМАТИКИ
ОЦЕНКА
ПРЕПОДАВАТЕЛЬ
Канд. техн. наук |
|
С. А. Чернышев |
должность, уч. степень, звание |
подпись, дата |
инициалы, фамилия |
ОТЧЕТ О ПРАКТИЧЕСКОЙ РАБОТЕ №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);
}
}
}