2023-01-20 00:56:30 +03:00
\documentclass [j-spec.tex] { subfiles}
2023-01-11 18:55:36 +03:00
\usepackage { spreadtab}
\begin { document}
2023-01-12 23:21:17 +03:00
\setcounter { section} { 4}
2023-01-20 00:56:30 +03:00
\section { Семинар: тонкости работы}
2023-01-11 18:55:36 +03:00
\subsection { Инструментарий}
\begin { itemize}
2023-01-20 00:56:30 +03:00
\item \href { https://docs.google.com/presentation/d/1zW_ qrNiH5xH0jRZApzWQWH3eC_ qJuzRJAPPsnpNDSig} { Презентация} для преподавателя, ведущего семинар;
2023-01-11 18:55:36 +03:00
\item \href { https://drive.google.com/file/d/1LWyE8aEy4-1gsognqhXIXwDcoLviVge4/view} { Фон} GeekBrains для проведения семинара в Zoom;
\item JDK любая 11 версии и выше;
\item \href { https://www.jetbrains.com/idea/download} { IntelliJ IDEA Community Edition} для практики и примеров используется IDEA.
\end { itemize}
\subsection { Цели семинара}
\begin { itemize}
\item Практика создания, отправки и принятия данных;
\item сохранение и загрузка состояния программы между запусками;
\item работа с большими текстами (поиск, замена, генерация);
\item начало рассмотрения популярных пакетов ввода-вывода.
\end { itemize}
\subsection { План-содержание}
\noindent
\begin { spreadtab} { { longtable} { |p{ 37mm} |l|l|p{ 90mm} |} }
\hline
@ Что происходит & @ Время & @ Слайды & @ Описание \\
\hline
\endhead
2023-01-31 23:33:32 +03:00
@ Организационный момент & 5 tag(beg) & @ 1-5 & @ Преподаватель ожидает студентов, поддерживает активность и коммуникацию в чате, озвучивает цели и планы на семинар. Важно упомянуть, что выполнение домашних заданий с лекции является, фактически, подготовкой к семинару \\
2023-01-11 18:55:36 +03:00
\hline
@ Quiz & 5 & @ 6-18 & @ Преподаватель задаёт вопросы викторины, через 30 секунд демонстрирует слайд-подсказку и ожидает ответов (6 вопросов, по минуте на ответ) \\
\hline
2023-01-20 00:56:30 +03:00
@ Рассмотрение ДЗ лекции & 10 & @ 19-27 & @ Преподаватель демонстрирует свой вариант решения домашнего задания с лекции, возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов \\
2023-01-11 18:55:36 +03:00
\hline
2023-01-20 00:56:30 +03:00
@ Вопросы и ответы & 10 & @ 28 & @ Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы \\
2023-01-11 18:55:36 +03:00
\hline
2023-01-20 00:56:30 +03:00
@ Задание 1 & 10 & @ 29-33 & @ Сохранение состояния приложения между запусками \\
2023-01-11 18:55:36 +03:00
\hline
2023-01-20 00:56:30 +03:00
@ Задание 2 & 15 & @ 34-37 & @ Загрузка состояния приложения при запуске \\
2023-01-11 18:55:36 +03:00
\hline
2023-01-20 00:56:30 +03:00
@ Перерыв (если нужен) & 5 & @ 38 & @ Преподаватель предлагает студентам перерыв на 5 минут (студенты голосуют) \\
\hline
@ Задание 3 & 10 & @ 39-42 & @ Работа с текстом (автоматизированный поиск и замена текста в файле или группе файлов) \\
\hline
@ Задание 4 & 15 & @ 43-46 & @ Работа с файловой системой \\
\hline
@ Задание 5 (необязат) & 20 & @ 47-49 & @ Описание часто недостающих механик операционной системы по «массовой» работе с файлами \\
2023-01-11 18:55:36 +03:00
\hline
@ Домашнее задание & 5 & @ 50-51 & @ Объясните домашнее задание, подведите итоги урока \\
\hline
@ Рефлексия & 10 tag(end) & @ 52-53 & @ Преподаватель запрашивает обратную связь \\
\hline
@ Длительность & sum(cell(beg):cell(end)) & & \\
\hline
\end { spreadtab}
\subsection { Подробности}
2023-01-19 19:10:17 +03:00
\subsubsection * { Организационный момент}
2023-01-11 18:55:36 +03:00
\begin { itemize}
\item \textbf { Цель этапа:} Позитивно начать урок, создать комфортную среду для обучения.
\item \textbf { Тайминг:} 3-5 минут.
\item \textbf { Действия преподавателя:}
\begin { itemize}
\item Запрашивает активность от аудитории в чате;
\item Презентует цели курса и семинара;
\item Презентует краткий план семинара и что студент научится делать.
\end { itemize}
\end { itemize}
2023-01-19 19:10:17 +03:00
\subsubsection * { Quiz}
2023-01-11 18:55:36 +03:00
\begin { itemize}
\item \textbf { Цель этапа:} Вовлечение аудитории в обратную связь.
\item \textbf { Тайминг:} 5-7 минут (4 вопроса, по минуте на ответ).
\item \textbf { Действия преподавателя:}
\begin { itemize}
\item Преподаватель задаёт вопросы викторины, представленные на слайдах презентации;
\item через 30 секунд демонстрирует слайд-подсказку и ожидает ответов.
\end { itemize}
\item \textbf { Вопросы и ответы:}
\begin { enumerate}
2023-01-17 23:40:14 +03:00
\item Что такое GPT? (2)
2023-01-11 18:55:36 +03:00
\begin { enumerate}
2023-01-12 23:21:17 +03:00
\item General partition trace;
\item GUID partition table;
\item Greater pass timing.
2023-01-11 18:55:36 +03:00
\end { enumerate}
2023-01-17 23:40:14 +03:00
\item Строки в языке Java -- это: (3)
2023-01-11 18:55:36 +03:00
\begin { enumerate}
2023-01-12 23:21:17 +03:00
\item классы;
\item массивы;
\item объекты.
\end { enumerate}
2023-01-17 23:40:14 +03:00
\item Ссылка на местонахождение -- это: (2)
2023-01-12 23:21:17 +03:00
\begin { enumerate}
\item URI;
\item URL;
\item URN.
\end { enumerate}
2023-01-17 23:40:14 +03:00
\item Возможно ли чтение совершенно случайного байта данных из потока, к которому подключен объект \code { BufferedInputStream} ? (2)
2023-01-12 23:21:17 +03:00
\begin { enumerate}
\item да;
\item нет;
\item да, если это поток в программу из локального файла.
2023-01-11 18:55:36 +03:00
\end { enumerate}
\end { enumerate}
\end { itemize}
2023-01-19 19:10:17 +03:00
\subsubsection * { Рассмотрение ДЗ}
2023-01-11 18:55:36 +03:00
\begin { itemize}
\item \textbf { Цель этапа:} Пояснить не очевидные моменты в формулировке ДЗ с лекции, синхронизировать прочитанный на лекции материал к началу семинара.
\item \textbf { Тайминг:} 15-20 минут.
\item \textbf { Действия преподавателя:}
\begin { itemize}
\item Преподаватель демонстрирует свой вариант решения домашнего задания из лекции;
\item возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов.
\end { itemize}
\item \textbf { Домашнее задание из лекции:}
2023-01-12 23:21:17 +03:00
\begin { itemize}
\item Создать пару-тройку текстовых файлов. Для упрощения (чтобы не разбираться с кодировками) внутри файлов следует писать текст только латинскими буквами.
2023-01-11 18:55:36 +03:00
2023-01-12 23:21:17 +03:00
\textbf { Вариант решения}
2023-01-11 18:55:36 +03:00
2023-01-12 23:21:17 +03:00
Задание не предполагало кода, но будет плюсом, если студенты создали файлы не вручную, а программным кодом. Для этого и последующих заданий понадобится набор констант и вспомогательный массив с названиями файлов
\begin { lstlisting} [language=Java,style=JCodeStyle,label={ } ,caption={ } ]
private static final Random rnd = new Random();
private static final int CHAR_ BOUND_ L = 65;
private static final int CHAR_ BOUND_ H = 90;
private static final int FILES_ AMOUNT = 10;
private static final int WORDS_ AMOUNT = 5;
private static final int WORD_ LENGTH = 10;
private static final String WORD_ TO_ SEARCH = "geekbrains";
String[] fileNames = new String[FILES_ AMOUNT];
for (int i = 0; i < fileNames.length; i++)
fileNames[i] = "file_ " + i + ".txt";
\end { lstlisting}
Файл записывается простым выходным потоком, в который (в приведённом ниже примере) записывается строка, сгенерированная методом. Из строки выделяется массив байтов методом \code { getBytes()} .
\begin { lstlisting} [language=Java,style=JCodeStyle,label={ } ,caption={ } ]
private static String generateSymbols(int amount) {
StringBuilder sequence = new StringBuilder();
for (int i = 0; i < amount; i++)
sequence.append((char) (CHAR_ BOUND_ L + rnd.nextInt(CHAR_ BOUND_ H - CHAR_ BOUND_ L)));
return sequence.toString();
2023-01-11 18:55:36 +03:00
}
2023-01-12 23:21:17 +03:00
private static void writeFileContents(String fileName, int length) throws IOException {
FileOutputStream fos = new FileOutputStream(fileName);
fos.write(generateSymbols(length).getBytes());
fos.flush();
fos.close();
2023-01-11 18:55:36 +03:00
}
2023-01-12 23:21:17 +03:00
\end { lstlisting}
Вызов методов обёрнут в \code { try...catch} и формирует сразу файлы как для второго задания (конкатенации), так и третьего (поиска).
\begin { lstlisting} [language=Java,style=JCodeStyle,label={ } ,caption={ } ]
try {
//#1
for (int i = 0; i < fileNames.length; i++)
if (i < 2)
writeFileContents(fileNames[i], 100);
else
writeFileContents(fileNames[i], WORDS_ AMOUNT, WORD_ LENGTH);
System.out.println("First task results are in file_ 0 and file_ 1.");
2023-01-11 18:55:36 +03:00
}
2023-01-12 23:21:17 +03:00
catch (Exception ex) { throw new RuntimeException(ex); }
\end { lstlisting}
2023-01-11 18:55:36 +03:00
2023-01-12 23:21:17 +03:00
\item Написать метод, осуществляющий конкатенацию (соединение) переданных ей в качестве параметров файлов (не особенно важно, в первый допишется второй или во второй первый, или файлы вовсе объединятся в какой-то третий);
2023-01-11 18:55:36 +03:00
2023-01-12 23:21:17 +03:00
\textbf { Вариант решения}
2023-01-31 23:33:32 +03:00
Метод конкатенации может также быть написан множеством способов, но важно, чтобы при буферизации (чаще всего решения содержат именно буферизованные варианты) не терялись символы, например, пробелы или переходы на новую строку. Также часто встречается дополнительная буферизация внутри программы, например, в строку, при помощи \code { StringBuilder} , что будет являться грубой ошибкой при конкатенации больших или бинарных файлов. Поэтому ниже представлен вариант решения с посимвольным чтением и записью в результирующий файл.
2023-01-12 23:21:17 +03:00
\begin { lstlisting} [language=Java,style=JCodeStyle,label={ } ,caption={ } ]
private static void concatenate(String file_ in1, String file_ in2, String file_ out) throws IOException {
FileOutputStream fos = new FileOutputStream(file_ out);
int ch;
FileInputStream fis = new FileInputStream(file_ in1);
while ((ch = fis.read()) != -1)
fos.write(ch);
fis.close();
fis = new FileInputStream(file_ in2);
while ((ch = fis.read()) != -1)
fos.write(ch);
fis.close();
fos.flush();
fos.close();
}
\end { lstlisting}
Вызов метода можно записать в секцию \code { try...catch} предыдущего задания или написать новую.
\begin { lstlisting} [language=Java,style=JCodeStyle,label={ } ,caption={ } ]
try {
//#2
concatenate(fileNames[0], fileNames[1], "FILE_ OUT.txt");
System.out.println("Second task result is in FILE_ OUT.");
}
catch (Exception ex) { throw new RuntimeException(ex); }
\end { lstlisting}
\item Написать метод поиска слова внутри файла.
\textbf { Вариант решения}
Для поиска слова понадобится файл не с о сплошными символами (хотя и в таком алгоритм поиска должен отработать нормально), а с о словами, разделёнными пробелами. Для этого можно видоизменить метод генерации файла и написать перегруженный, который будет по некоторому псевдослучайному условию вставлять в файл через пробел либо случайно сгенерированную последовательность символов, либо слово, заранее определённое, как искомое.
\begin { lstlisting} [language=Java,style=JCodeStyle,label={ } ,caption={ } ]
private static void writeFileContents(String fileName, int words, int length) throws IOException {
FileOutputStream fos = new FileOutputStream(fileName);
for (int i = 0; i < words; i++) {
if(rnd.nextInt(WORDS_ AMOUNT) == WORDS_ AMOUNT / 2)
fos.write(WORD_ TO_ SEARCH.getBytes());
else
fos.write(generateSymbols(length).getBytes());
fos.write(' ');
}
fos.flush();
fos.close();
}
\end { lstlisting}
Формально, можно выполнить работу следующим образом, используя \code { Scanner} , сравнивая слова «от пробела до пробела»
\begin { lstlisting} [language=Java,style=JCodeStyle,label={ } ,caption={ } ]
private static boolean fileScanner(String fileName, String word) throws IOException {
Scanner sc = new Scanner(new FileInputStream(fileName));
word = word.toLowerCase(); // \n
while (sc.hasNext()) {
String line = sc.nextLine();
line = line.toLowerCase();
if (line.contains(word)) return true;
}
return false;
}
\end { lstlisting}
2023-01-17 23:40:14 +03:00
Н о более гибким получится алгоритм, ищущий непосредственно последовательность символов, сравнивая их по одному, это позволяет искать не только словосочетания, но и, например, диалоги персонажей в книге. Данная ниже реализация может найти представленную в комментарии комбинацию, когда неверный символ слова является началом верной последовательности.
2023-01-12 23:21:17 +03:00
\begin { lstlisting} [language=Java,style=JCodeStyle,label={ } ,caption={ } ]
private static boolean isInFile(String fileName, String search) throws IOException {
FileInputStream fis = new FileInputStream(fileName);
byte[] searchSequence = search.getBytes();
int ch;
int i = 0; // geekgeekbrains
while ((ch = fis.read()) != -1) {
if (ch == searchSequence[i])
i++;
else {
i = 0;
if (ch == searchSequence[i]) i++;
}
if (i == searchSequence.length) {
fis.close();
return true;
}
}
fis.close();
return false;
}
\end { lstlisting}
2023-01-17 23:40:14 +03:00
Ещё более точной будет реализация, в которой формируется некоторое окно поиска, фактически, буфер, смещающийся посимвольно по читаемому файлу, это позволяет найти слово «гоголь» в комбинации «гогоголь».
\begin { lstlisting} [language=Java,style=JCodeStyle,label={ } ,caption={ } ]
private static boolean isInFile(String fileName, String search) throws IOException {
try (FileInputStream fis = new FileInputStream(fileName)) {
int ch;
StringBuilder sb = new StringBuilder();
while ((ch = fis.read()) != -1 & & sb.length() < search.length()) {
sb.append((char) ch);
}
do {
if (sb.toString().equals(search))
return true;
sb.deleteCharAt(0);
sb.append((char) ch);
} while ((ch = fis.read()) != -1);
} catch (IOException e) {
throw new RuntimeException(e);
}
return false;
}
\end { lstlisting}
2023-01-12 23:21:17 +03:00
\end { itemize}
2023-01-11 18:55:36 +03:00
\end { itemize}
2023-01-19 19:10:17 +03:00
\subsubsection * { Вопросы и ответы}
2023-01-11 18:55:36 +03:00
\begin { itemize}
2023-01-20 00:56:30 +03:00
\item \textbf { Ценность этапа} Вовлечение аудитории в обратную связь, пояснение неочевидных моментов в материале лекции и другой проделанной работе.
2023-01-11 18:55:36 +03:00
\item \textbf { Тайминг} 5-15 минут
\item \textbf { Действия преподавателя}
\begin { itemize}
\item Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы;
\item Если преподаватель затрудняется с ответом, необходимо мягко предложить студенту ответить на е г о вопрос на следующем семинаре (и не забыть найти ответ на вопрос студента!);
\item Предложить и показать пути самостоятельного поиска студентом ответа на заданный вопрос;
\item Посоветовать литературу на тему заданного вопроса;
\item Дополнительно указать на то, что все сведения для выполнения домашнего задания, прохождения викторины и работы на семинаре были рассмотрены в методическом материале к этому или предыдущим урокам.
\end { itemize}
\end { itemize}
2023-01-19 19:10:17 +03:00
\subsubsection * { Задание 1}
2023-01-11 18:55:36 +03:00
\begin { itemize}
2023-01-19 13:47:54 +03:00
\item \textbf { Ценность этапа} Сохранение состояния приложения между запусками
2023-01-20 00:56:30 +03:00
\item \textbf { Тайминг} 10-15 мин
2023-01-11 18:55:36 +03:00
\item \textbf { Действия преподавателя}
\begin { itemize}
\item Выдать задание студентам;
2023-01-19 13:47:54 +03:00
\item Подробно объяснить, что именно требуется от студентов, избегая упоминания конкретных языковых конструкций;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
2023-01-11 18:55:36 +03:00
\end { itemize}
2023-01-17 23:40:14 +03:00
\item \textbf { Задание} :
2023-01-19 13:47:54 +03:00
\begin { itemize}
\item Создать массив из 9 цифр и записать е г о в файл, используя поток вывода.
\textbf { Вариант решения}
\begin { lstlisting} [language=Java,style=JCodeStyle]
int[] ar0 = { 1,2,3,4,5,6,7,8,0,8,7,6,5,4,3} ;
final int DIGIT_ BOUND = 48;
FileOutputStream fos = new FileOutputStream("save.out");
fos.write('[');
for (int i = 0; i < ar0.length; i++) {
fos.write(DIGIT_ BOUND + ar0[i]);
if (i < ar0.length - 1) fos.write(',');
}
fos.write(']');
fos.flush();
fos.close();
\end { lstlisting}
\item [$ * _ 1 $ ] Удостовериться, что числа записаны не символами, а цифрами, что сократит объём хранения в 8 и более раз (из-за представления цифр в виде ASCII символов). При этом важно помнить о допущениях такого способа записи, поскольку числа нужно как-то отделять друг от друга, а любой символ, например, пробел (32), имеет числовое представление, и внутри файла будет неотличим от числа 20. А любое отрицательное число будет воспринято потоком чтения как конец потока. Для выполнения задания сделать разделителем число 0.
2023-01-17 23:40:14 +03:00
\textbf { Вариант решения}
2023-01-19 13:47:54 +03:00
\begin { lstlisting} [language=Java,style=JCodeStyle]
// assuming 0 is divider
int[] ar1 = { 1,2,3,4,5,6,7,8,9,8,7,6,5,4,3} ;
FileOutputStream fos = new FileOutputStream("save0.out");
for (int i = 0; i < ar0.length; i++) {
fos.write(ar1[i]);
fos.write(0);
}
fos.flush();
fos.close();
\end { lstlisting}
\end { itemize}
\end { itemize}
2023-01-11 18:55:36 +03:00
2023-01-19 19:10:17 +03:00
\subsubsection * { Задание 2}
2023-01-19 13:47:54 +03:00
\begin { itemize}
\item \textbf { Ценность этапа} Загрузка состояния приложения при запуске
\item \textbf { Тайминг} 15-20 мин
\item \textbf { Действия преподавателя}
\begin { itemize}
\item Выдать задание студентам;
\item Подробно объяснить, что именно требуется от студентов, избегая упоминания конкретных языковых конструкций;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\end { itemize}
\item \textbf { Задание} :
\begin { itemize}
\item Создать массив целых чисел и заполнить е г о информацией из файла, записанного в предыдущем задании.
\textbf { Вариант решения}
\begin { lstlisting} [language=Java,style=JCodeStyle]
int[] ar00 = new int[15];
final int DIGIT_ BOUND = 48;
FileInputStream fis = new FileInputStream("save.out");
fis.read(); // '['
for (int i = 0; i < ar00.length; i++) {
ar00[i] = fis.read() - DIGIT_ BOUND;
fis.read(); // ','
}
fis.close();
System.out.println(Arrays.toString(ar00));
\end { lstlisting}
2023-01-19 18:24:23 +03:00
\item [$ * _ 1 $ ] Прочитать данные из файла с числами, предполагая, что разделитель -- это число 0.
2023-01-19 13:47:54 +03:00
\textbf { Вариант решения}
\begin { lstlisting} [language=Java,style=JCodeStyle]
int[] ar10 = new int[15];
// assuming 0 is divider
FileInputStream fis = new FileInputStream("save0.out");
int b;
int i = 0;
while ((b = fis.read()) != -1) {
if (b != 0) {
ar10[i++] = b;
}
}
fis.close();
System.out.println(Arrays.toString(ar10));
\end { lstlisting}
2023-01-19 18:24:23 +03:00
\end { itemize}
\end { itemize}
2023-01-19 13:47:54 +03:00
2023-01-19 19:10:17 +03:00
\subsubsection * { Задание 3}
2023-01-19 18:24:23 +03:00
\begin { itemize}
\item \textbf { Ценность этапа} Работа с текстом (автоматизированный поиск и замена текста в файле или группе файлов)
\item \textbf { Тайминг} 10-15 мин
\item \textbf { Действия преподавателя}
\begin { itemize}
\item Выдать задание студентам;
\item Подробно объяснить, что именно требуется от студентов, избегая упоминания конкретных языковых конструкций;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\end { itemize}
\item \textbf { Задание} :
\begin { itemize}
\item Написать программу заменяющую указанный символ в текстовом файле на пробел, сохраняющую получившийся текст в новый файл.
2023-01-19 13:47:54 +03:00
\textbf { Вариант решения}
\begin { lstlisting} [language=Java,style=JCodeStyle]
2023-01-19 18:24:23 +03:00
FileInputStream fis = new FileInputStream("Main.java");
int i;
char what = ',';
char to = '!';
FileOutputStream fos = new FileOutputStream("Main.java.new");
while ((i = fis.read()) != -1) {
if (i == what)
fos.write(to);
else
fos.write(i);
}
2023-01-19 13:47:54 +03:00
2023-01-19 18:24:23 +03:00
fos.close();
\end { lstlisting}
\item [$ * _ 1 $ ] Модифицировать алгоритм поиска замены символа так, чтобы программа осуществляла замену слова (последовательного набора символов) в исходном файле и записывала результат в новый файл.
\textbf { Вариант решения}
\begin { lstlisting} [language=Java,style=JCodeStyle]
String search = "Hello";
String l = "Goodbye";
FileInputStream fis = new FileInputStream("Main.java");
FileOutputStream fos = new FileOutputStream("Main.java.new");
int ch;
StringBuilder sb = new StringBuilder();
while ((ch = fis.read()) != -1) {
sb.append((char) ch);
if (sb.length() == search.length()) {
if (sb.toString().equals(search)) {
fos.write(l.getBytes());
sb.delete(0, search.length());
} else {
fos.write(sb.charAt(0));
sb.deleteCharAt(0);
}
2023-01-19 13:47:54 +03:00
}
}
2023-01-19 18:24:23 +03:00
fos.write(sb.toString().getBytes());
\end { lstlisting}
\end { itemize}
\end { itemize}
2023-01-19 13:47:54 +03:00
2023-01-19 19:10:17 +03:00
\subsubsection * { Задание 4}
2023-01-19 18:24:23 +03:00
\begin { itemize}
\item \textbf { Ценность этапа} Работа с файловой системой
\item \textbf { Тайминг} 15-20 мин
\item \textbf { Действия преподавателя}
\begin { itemize}
\item Выдать задание студентам;
\item Подробно объяснить, что именно требуется от студентов, избегая упоминания конкретных языковых конструкций;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\end { itemize}
\item \textbf { Задание} :
\begin { itemize}
\item Написать программу, читающую и выводящую в содержимое текущей папки .
\textbf { Вариант решения}
\begin { lstlisting} [language=Java,style=JCodeStyle]
int count = 0;
File path = new File( new File(".").getCanonicalPath() );
File[] dir = path.listFiles();
for (int i = 0; i < dir.length; i++) {
if (dir[i].isDirectory()) continue;
System.out.println(dir[i]);
}
\end { lstlisting}
\item [$ * _ 1 $ ] Дописать программу таким образом, чтобы она рекурсивно выводила содержимое не только текущей папки, но и вложенных.
\textbf { Вариант решения}
\begin { lstlisting} [language=Java,style=JCodeStyle]
void printContents(String path) throws IOException {
int count = 0;
File fullPath = new File(new File(path).getCanonicalPath() );
File[] dir = fullPath.listFiles();
for (int i = 0; i < dir.length; i++) {
if (dir[i].isDirectory()) printContents(dir[i].toString());
System.out.println(dir[i]);
}
}
\end { lstlisting}
\begin { lstlisting} [language=Java,style=JCodeStyle]
void printContents(".");
\end { lstlisting}
2023-01-19 13:47:54 +03:00
\end { itemize}
2023-01-11 18:55:36 +03:00
\end { itemize}
2023-01-19 19:10:17 +03:00
\subsubsection * { Задание 5 (необязательное)}
2023-01-19 18:24:23 +03:00
\begin { itemize}
\item \textbf { Ценность этапа} Описание часто недостающих механик операционной системы по «массовой» работе с файлами.
2023-01-20 00:56:30 +03:00
\item \textbf { Тайминг} 20-25 мин
2023-01-19 18:24:23 +03:00
\item \textbf { Действия преподавателя}
\begin { itemize}
\item Выдать задание студентам;
\item Подробно объяснить, что именно требуется от студентов, избегая упоминания конкретных языковых конструкций;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\end { itemize}
\item \textbf { Задание} : Написать функцию, добавляющую префикс к каждому из набора файлов, названия которых переданы ей в качестве параметров через пробел.
\textbf { Вариант решения}
\begin { lstlisting} [language=Java,style=JCodeStyle]
String[] a = { "Main.java", "a.txt"} ;
for (String fileName : a) {
Path file = Path.of(fileName);
if (Files.exists(file)) {
Files.move(file, Paths.get("pre_ " + file), REPLACE_ EXISTING);
} else {
System.out.printf("No file with name '%s'", fileName);
}
}
\end { lstlisting}
\end { itemize}
2023-01-17 23:40:14 +03:00
2023-01-19 19:10:17 +03:00
\subsubsection * { Домашнее задание}
2023-01-11 18:55:36 +03:00
\begin { itemize}
\item \textbf { Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
\item \textbf { Тайминг} 5-10 минут.
\item \textbf { Действия преподавателя}
\begin { itemize}
\item Пояснить студентам в каком виде выполнять и сдавать задания
\item Уточнить кто будет проверять работы (преподаватель или ревьювер)
\item Объяснить к кому обращаться за помощью и где искать подсказки
\item Объяснить где взять проект заготовки для дз
\end { itemize}
\item \textbf { Задания}
\begin { enumerate}
\item [5-25 мин] Выполнить все задания семинара, если они не были решены, без ограничений по времени;
\textbf { В с е варианты решения приведены в тексте семинара выше}
2023-01-19 18:24:23 +03:00
\item [15 мин] 1. Написать функцию, создающую резервную копию всех файлов в директории (без поддиректорий) во вновь созданную папку \code { ./backup}
\begin { lstlisting} [language=Java,style=JCodeStyle]
Files.createDirectory(Path.of("./backup"));
DirectoryStream<Path> dir = Files.newDirectoryStream(Path.of("."));
for (Path file : dir) {
if (Files.isDirectory(file)) continue;
Files.copy(file, Path.of("./backup/" + file.toString()));
2023-01-11 18:55:36 +03:00
}
2023-01-19 18:24:23 +03:00
\end { lstlisting}
\item [20-25 мин] 2. Предположить, что числа в исходном массиве из 9 элементов имеют диапазон $ [ 0 , 3 ] $ , и представляют собой, например, состояния ячеек поля для игры в крестики-нолики, где 0 -- это пустое поле, 1 -- это поле с крестиком, 2 -- это поле с ноликом, 3 -- резервное значение. Такое предположение позволит хранить в одном числе типа \code { int} всё поле 3х 3. Записать в файл 9 значений так, чтобы они заняли три байта.
\begin { lstlisting} [language=Java,style=JCodeStyle]
int[] ar2 = { 0,1,2,3,0,1,2,3,0} ;
2023-01-11 18:55:36 +03:00
2023-01-19 18:24:23 +03:00
FileOutputStream fos = new FileOutputStream("save1.out");
for (int b = 0; b < 3; b++) { // write to 3 bytes
byte wr = 0;
for (int v = 0; v < 3; v++) { // write by 3 values in each
wr += (byte) (ar2[3 * b + v] << (v * 2));
}
fos.write(wr);
2023-01-11 18:55:36 +03:00
}
2023-01-19 18:24:23 +03:00
fos.flush();
fos.close();
\end { lstlisting}
2023-01-11 18:55:36 +03:00
2023-01-19 18:24:23 +03:00
\item [20-25 мин] 3. Прочитать числа из файла, полученного в результате выполнения задания 2.
\begin { lstlisting} [language=Java,style=JCodeStyle]
int[] ar20 = new int[9];
FileInputStream fis = new FileInputStream("save1.out");
int b;
int i = 0;
while ((b = fis.read()) != -1) {
for (int v = 0; v < 3; ++v) { // 3 values of four possible
ar20[i++] = b >> (v * 2) & 0x3;
2023-01-11 18:55:36 +03:00
}
}
2023-01-19 18:24:23 +03:00
fis.close();
System.out.println(Arrays.toString(ar20));
\end { lstlisting}
2023-01-11 18:55:36 +03:00
\end { enumerate}
\end { itemize}
2023-01-19 19:10:17 +03:00
\subsubsection * { Рефлексия и завершение семинара}
2023-01-11 18:55:36 +03:00
\begin { itemize}
\item \textbf { Цель этапа:} Привести урок к логическому завершению, посмотреть что студентам удалось, что было сложно и над чем нужно еще поработать
\item \textbf { Тайминг:} 5-10 минут
\item \textbf { Действия преподавателя:}
\begin { itemize}
\item Запросить обратную связь от студентов.
\item Подчеркните то, чему студенты научились на занятии.
\item Дайте рекомендации по решению заданий, если в этом есть необходимость
\item Дайте краткую обратную связь студентам.
\item Поделитесь ощущением от семинара.
\item Поблагодарите за проделанную работу.
\end { itemize}
\end { itemize}
\newpage
\end { document}