HashMap и чтение из файла

159
10 июня 2021, 16:10

Написать программу в которой можно из консоли делать текстовые записи в файл (с помощью Scanner) в кодировке "cp1251".

Запись в файле должна отделяться от предыдущей, например линией.

Структура записи:

Дата и время когда сделана запись (должно добавляться автоматически) Текст записи

Добавьте метод для считывания всего файла в кодировке "cp1251". Этот метод должен записывать текстовый файл в коллекцию HashMap (словарь). Ключом будет Дата и время записи, значением - Текст записи. Вывести заполненную коллекцию HashMap в консоль. Например, есть файл с такой записью:

Tue Aug 20 21:54:53 EEST 2019

Привет мир

Tue Aug 20 21:55:13 EEST 2019

Hello World

Не получается сделать так, чтобы ключом была Дата. Помогите, пожалуйста.

  public static void main(String[] args) {
        Scanner sc = new Scanner(System.in, "Cp1251");
        String str = sc.nextLine();
        String lineSeparator = System.getProperty("line.separator");
        String fileName = "Test.txt";
        try (BufferedWriter bw = new BufferedWriter(
                new OutputStreamWriter(
                        new FileOutputStream(fileName, true),
                        "Cp1251"
                )
        )) {
            bw.append(new Date().toString()).append(lineSeparator).append(str);
            bw.append(lineSeparator).append("=====================================================").append(lineSeparator);
            bw.close();
        } catch (Exception e) {
            System.out.println(e);
        }
        reader();
    }
    public static void reader() {
        HashMap<Date, String> hm = new HashMap<>();
        try (BufferedReader br = new BufferedReader(
                new InputStreamReader(new FileInputStream("Test.txt"),
                        "Cp1251")
        )) {
            String s;
            while ((s = br.readLine()) != null) {
                hm.put(Date.from(Instant.EPOCH), s);
                System.out.println(s);
            }
           br.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}
Answer 1
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.InputStreamReader;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.BufferedReader;
import java.util.*;    
public class Examp5 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in, "Cp1251");
        String str = sc.nextLine();
        String lineSeparator = System.getProperty("line.separator");
        String fileName = "Test.txt";
        try (BufferedWriter bw = new BufferedWriter(
            new OutputStreamWriter(
                new FileOutputStream(fileName, true), "Cp1251"))) {
        bw.append(new Date().toString()).append(lineSeparator).append(str);
        bw.append(lineSeparator).append("==================").append(lineSeparator);
        bw.close();
        } catch (Exception e) {
            System.out.println(e);
        }
        reader();
    }
    public static void reader() {
        Map<String, String> hm = new LinkedHashMap<>();
        try (BufferedReader br = new BufferedReader(
            new InputStreamReader(new FileInputStream("Test.txt"),
                    "Cp1251"))) {
        String time;
        String text;
        while ((time = br.readLine()) != null) {
            text = br.readLine();
            hm.put(time, text);
            String s = br.readLine();
            if(s.contains("======")) continue;
        }
        br.close();
        } catch (Exception e) {
             System.out.println(e);
        }
        for(Map.Entry<String, String> entry : hm.entrySet()){         
            System.out.printf(
                "Time: %s  Text: %s\n", entry.getKey(), entry.getValue());
       }
   }
}

Насколько я понял из задания - нужно записывать в файл дату, на следующей строке текст и на третьей строке разделитель (==========). Затем считывать из файла и записывать ЭТО в мапу, ключ это дата (из этого файла!), а текст в значение. В твоём коде ты в файл пишешь правильно, а в мапу почему-то записываешь НОВУЮ дату, а не дату из файла:

m.put(Date.from(Instant.EPOCH), s);

насколько я понял, нужно именно строку даты из файла. И еще - я применил LinkedHashMap (может это и не важно) но так красивее, т.к. выводит элементы мапы в порядке как были в файле ))). Насчет алгоритма чтения из файла - там можно разными способами, читать по 3 строки, например, и записывать в мапу, заморочиться через "регулярки" и т.д. Главное чтобы работало.

READ ALSO
Реестр и параметры Java

Реестр и параметры Java

Ребят, подскажите, где в реестре лежат значения Java ? Например, выделенная в данный момент память для Jav'ыили любой другой путь, где лежит конфиг...

146
Как внедрить версию библиотеки из другой ветки в maven?

Как внедрить версию библиотеки из другой ветки в maven?

Есть большой проект, в него подтягиваются библиотеки с gitlab к которым у меня есть доступМне нужно поменять некоторые методы в этих библиотеках...

212
return возвращает неожидаемый результат

return возвращает неожидаемый результат

В сообщении хочу вывести сгенерированый парольОт меня программа ждёт цифру определяющую количество символов в нём

109
regex для определения страны в скобках

regex для определения страны в скобках

Помогите составить регулярное выражение, для определения страны в круглых скобкахНапример даны строки:

169