From 765197095ebd7cefeaab38a479b34706fa4dea93 Mon Sep 17 00:00:00 2001 From: Crodi Date: Thu, 21 Aug 2025 23:22:39 +0300 Subject: [PATCH 01/11] feat: add enum Type for task`s types, add method getType for Task, Epic, SubTask --- src/model/Epic.java | 4 ++++ src/model/SubTask.java | 4 ++++ src/model/Task.java | 3 +++ src/model/Type.java | 7 +++++++ 4 files changed, 18 insertions(+) create mode 100644 src/model/Type.java diff --git a/src/model/Epic.java b/src/model/Epic.java index a9fe2f7..64ac2c9 100644 --- a/src/model/Epic.java +++ b/src/model/Epic.java @@ -29,6 +29,10 @@ public ArrayList getSubtaskIds() { return subtaskIds; } + public Type getType() { + return Type.EPIC; + } + @Override public String toString() { return String.format("%s{id=%d, title=%s, description=%s, status=%s, subtasks=%s}", diff --git a/src/model/SubTask.java b/src/model/SubTask.java index 6f3071c..f008fcd 100644 --- a/src/model/SubTask.java +++ b/src/model/SubTask.java @@ -12,6 +12,10 @@ public int getEpicId() { return epicId; } + public Type getType() { + return Type.SUBTASK; + } + @Override public String toString() { return String.format("%s{id=%d, title=%s, description=%s, status=%s, epicId=%d}", diff --git a/src/model/Task.java b/src/model/Task.java index f1ba32b..fb40b07 100644 --- a/src/model/Task.java +++ b/src/model/Task.java @@ -47,6 +47,9 @@ public void setStatus(Status status) { this.status = status; } + public Type getType() { + return Type.TASK; + } @Override public String toString() { diff --git a/src/model/Type.java b/src/model/Type.java new file mode 100644 index 0000000..cfa6872 --- /dev/null +++ b/src/model/Type.java @@ -0,0 +1,7 @@ +package model; + +public enum Type { + TASK, + EPIC, + SUBTASK +} \ No newline at end of file From 31e90100bcc8daae83f139d7670e4f7979913dc9 Mon Sep 17 00:00:00 2001 From: Crodi Date: Thu, 21 Aug 2025 23:27:24 +0300 Subject: [PATCH 02/11] feat: add new manager FileBackedTaskManager, that saves data into file and can extract it. Add exception for this manager. FileBackedTaskManager extends InMemoryTaskManager. feat!: field idCount in InMemoryTaskManager changed access to protected, to support FileBackedTaskManager logic. --- src/managers/FileBackedTaskManager.java | 196 ++++++++++++++++++ src/managers/InMemoryTaskManager.java | 2 +- .../exceptions/ManagerSaveException.java | 12 ++ 3 files changed, 209 insertions(+), 1 deletion(-) create mode 100644 src/managers/FileBackedTaskManager.java create mode 100644 src/managers/exceptions/ManagerSaveException.java diff --git a/src/managers/FileBackedTaskManager.java b/src/managers/FileBackedTaskManager.java new file mode 100644 index 0000000..3f0626a --- /dev/null +++ b/src/managers/FileBackedTaskManager.java @@ -0,0 +1,196 @@ +package managers; + +import managers.exceptions.ManagerSaveException; +import model.*; + +import java.io.*; +import java.util.ArrayList; + +import static model.Type.EPIC; +import static model.Type.TASK; + +public class FileBackedTaskManager extends InMemoryTaskManager { + + /*первая служебная строка файла*/ + private final static String FIRST_LINE = "id,type,name,status,description,epic"; + + private final static File FILE = new File("resources" + File.separator + "tasks.csv"); + + + public static FileBackedTaskManager loadFromFile() { + + if (!FILE.exists()) { + /* Если файла не существует, то возвращается пустой готовый к работе менеджер*/ + return new FileBackedTaskManager(); + } + + FileBackedTaskManager manager = new FileBackedTaskManager(); + + try (BufferedReader reader = new BufferedReader(new FileReader(FILE))) { + reader.readLine(); // пропуск первой служебной строки + + /*конечный id, который будет присвоен idCount(далее счетчик) в manager*/ + int maxId = 0; + + while (reader.ready()) { + String[] parts = reader.readLine().split(","); + + int id = Integer.parseInt(parts[0]); + + maxId = Math.max(maxId, id); // сохраняется максимальный id + + /* менеджер сам присваивает id, + * но не знает верного счетчика для каждого таска, + * поэтому счетчик устанавливается на id - 1 (то есть предыдущее значение), + * а уже в методе добавления счетчик увеличивается на один, устанавливая верное значение */ + manager.idCount = id - 1; + + Type type = Type.valueOf(parts[1]); + String title = parts[2]; + Status status = Status.valueOf(parts[3]); + String description = parts[4]; + + if (type == TASK) { + manager.addTask(new Task(title, description, status)); + } else if (type == EPIC) { + manager.addEpic(new Epic(title, description, status)); + } else { + manager.addSubTask(new SubTask(title, description, status, Integer.parseInt(parts[5]))); + } + } + /*счетчик устанавливается на максимальный найденный id, + * теперь отсчет id всех новых тасков будет от этого значения*/ + manager.idCount = maxId; + + } catch (IOException e) { + e.printStackTrace(); + } + + return manager; + } + + private void save() { + + try (BufferedWriter bw = new BufferedWriter(new FileWriter(FILE))) { + bw.write(FIRST_LINE); + bw.newLine(); + + writeTasks(bw, super.getTasks()); // записываются таски + writeTasks(bw, super.getEpics()); // записываются эпики + writeSubTasks(bw, super.getSubTasks()); // записываются сабтаски + + } catch (IOException e) { + throw new ManagerSaveException(); + } + } + + private void writeTasks(BufferedWriter bw, ArrayList tasks) throws IOException { + /* Для записи в файл таска или эпика требуются методы, + * которые реализованы в родительском классе Task, + * следовательно, можно воспользоваться дженериком + * и не создавать два одинаковых метода для тасков и эпиков*/ + + for (Task task : tasks) { + String line = String.format("%s,%s,%s,%s,%s", + task.getTaskId(), + task.getType(), + task.getTitle(), + task.getStatus(), + task.getDescription() + ); + + bw.write(line); + bw.newLine(); + } + } + + private void writeSubTasks(BufferedWriter bw, ArrayList subTasks) throws IOException { + /* Для записи сабтаска нам требуется метод getEpicId, + * поэтому метод writeSubTask отдельный*/ + for (SubTask subTask : subTasks) { + String line = String.format("%s,%s,%s,%s,%s,%s", + subTask.getTaskId(), + subTask.getType(), + subTask.getTitle(), + subTask.getStatus(), + subTask.getDescription(), + subTask.getEpicId() + ); + + bw.write(line); + bw.newLine(); + } + } + + @Override + public void addTask(Task task) { + super.addTask(task); + save(); + } + + @Override + public void addEpic(Epic epic) { + super.addEpic(epic); + save(); + } + + @Override + public void addSubTask(SubTask subTask) { + super.addSubTask(subTask); + save(); + } + + @Override + public void updateTask(Task task) { + super.updateTask(task); + save(); + } + + @Override + public void updateEpic(Epic epic) { + super.updateTask(epic); + save(); + } + + @Override + public void updateSubTask(SubTask subTask) { + super.updateSubTask(subTask); + save(); + } + + @Override + public void deleteTask(int id) { + super.deleteTask(id); + save(); + } + + @Override + public void deleteEpic(int id) { + super.deleteEpic(id); + save(); + } + + @Override + public void deleteSubTask(int id) { + super.deleteSubTask(id); + save(); + } + + @Override + public void clearTasks() { + super.clearTasks(); + save(); + } + + @Override + public void clearEpics() { + super.clearEpics(); + save(); + } + + @Override + public void clearSubTasks() { + super.clearSubTasks(); + save(); + } +} diff --git a/src/managers/InMemoryTaskManager.java b/src/managers/InMemoryTaskManager.java index 0c8396a..e48f3b4 100644 --- a/src/managers/InMemoryTaskManager.java +++ b/src/managers/InMemoryTaskManager.java @@ -11,7 +11,7 @@ import java.util.List; public class InMemoryTaskManager implements TaskManager { - private int idCount; + protected int idCount; private final HashMap tasks = new HashMap<>(); private final HashMap epics = new HashMap<>(); private final HashMap subtasks = new HashMap<>(); diff --git a/src/managers/exceptions/ManagerSaveException.java b/src/managers/exceptions/ManagerSaveException.java new file mode 100644 index 0000000..3e0b69d --- /dev/null +++ b/src/managers/exceptions/ManagerSaveException.java @@ -0,0 +1,12 @@ +package managers.exceptions; + +public class ManagerSaveException extends RuntimeException { + + public ManagerSaveException() { + super(); + } + + public ManagerSaveException(String message) { + super(message); + } +} From 769e609737951f0df80181f06d45987e020b336b Mon Sep 17 00:00:00 2001 From: Crodi Date: Thu, 21 Aug 2025 23:28:27 +0300 Subject: [PATCH 03/11] feat: add file with service line for FileBackedTaskManager. --- resources/tasks.csv | 1 + 1 file changed, 1 insertion(+) create mode 100644 resources/tasks.csv diff --git a/resources/tasks.csv b/resources/tasks.csv new file mode 100644 index 0000000..5cdfc28 --- /dev/null +++ b/resources/tasks.csv @@ -0,0 +1 @@ +id,type,name,status,description,epic From d5996763add60acc82d0a53eba66ca6ca50eeb96 Mon Sep 17 00:00:00 2001 From: Crodi Date: Thu, 21 Aug 2025 23:35:12 +0300 Subject: [PATCH 04/11] fix: add file encoding --- src/managers/FileBackedTaskManager.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/managers/FileBackedTaskManager.java b/src/managers/FileBackedTaskManager.java index 3f0626a..c701897 100644 --- a/src/managers/FileBackedTaskManager.java +++ b/src/managers/FileBackedTaskManager.java @@ -4,6 +4,7 @@ import model.*; import java.io.*; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import static model.Type.EPIC; @@ -26,7 +27,7 @@ public static FileBackedTaskManager loadFromFile() { FileBackedTaskManager manager = new FileBackedTaskManager(); - try (BufferedReader reader = new BufferedReader(new FileReader(FILE))) { + try (BufferedReader reader = new BufferedReader(new FileReader(FILE, StandardCharsets.UTF_8))) { reader.readLine(); // пропуск первой служебной строки /*конечный id, который будет присвоен idCount(далее счетчик) в manager*/ @@ -71,7 +72,7 @@ public static FileBackedTaskManager loadFromFile() { private void save() { - try (BufferedWriter bw = new BufferedWriter(new FileWriter(FILE))) { + try (BufferedWriter bw = new BufferedWriter(new FileWriter(FILE, StandardCharsets.UTF_8))) { bw.write(FIRST_LINE); bw.newLine(); From 1037ab940bdba9d71c9ec63b2d168db684679423 Mon Sep 17 00:00:00 2001 From: Crodi Date: Thu, 21 Aug 2025 23:48:12 +0300 Subject: [PATCH 05/11] fix: changed FIlE from constant to parameter --- src/managers/FileBackedTaskManager.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/managers/FileBackedTaskManager.java b/src/managers/FileBackedTaskManager.java index c701897..bf7a874 100644 --- a/src/managers/FileBackedTaskManager.java +++ b/src/managers/FileBackedTaskManager.java @@ -15,19 +15,22 @@ public class FileBackedTaskManager extends InMemoryTaskManager { /*первая служебная строка файла*/ private final static String FIRST_LINE = "id,type,name,status,description,epic"; - private final static File FILE = new File("resources" + File.separator + "tasks.csv"); + private final File FILE; + public FileBackedTaskManager(File file) { + this.FILE = file; + } - public static FileBackedTaskManager loadFromFile() { + public static FileBackedTaskManager loadFromFile(File file) { - if (!FILE.exists()) { - /* Если файла не существует, то возвращается пустой готовый к работе менеджер*/ - return new FileBackedTaskManager(); + if (!file.exists()) { + /* Если файла не существует, то возвращается пустой менеджер*/ + return new FileBackedTaskManager(file); } - FileBackedTaskManager manager = new FileBackedTaskManager(); + FileBackedTaskManager manager = new FileBackedTaskManager(file); - try (BufferedReader reader = new BufferedReader(new FileReader(FILE, StandardCharsets.UTF_8))) { + try (BufferedReader reader = new BufferedReader(new FileReader(file, StandardCharsets.UTF_8))) { reader.readLine(); // пропуск первой служебной строки /*конечный id, который будет присвоен idCount(далее счетчик) в manager*/ From d99cd1b8e6a9e56d5d119b2ff19ee1bd7f052299 Mon Sep 17 00:00:00 2001 From: Crodi Date: Thu, 21 Aug 2025 23:51:14 +0300 Subject: [PATCH 06/11] fix: add new constructor to ManagerSaveException --- src/managers/FileBackedTaskManager.java | 2 +- src/managers/exceptions/ManagerSaveException.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/managers/FileBackedTaskManager.java b/src/managers/FileBackedTaskManager.java index bf7a874..5cfa4a1 100644 --- a/src/managers/FileBackedTaskManager.java +++ b/src/managers/FileBackedTaskManager.java @@ -84,7 +84,7 @@ private void save() { writeSubTasks(bw, super.getSubTasks()); // записываются сабтаски } catch (IOException e) { - throw new ManagerSaveException(); + throw new ManagerSaveException("Ошибка сохранения файла", e); } } diff --git a/src/managers/exceptions/ManagerSaveException.java b/src/managers/exceptions/ManagerSaveException.java index 3e0b69d..9a00698 100644 --- a/src/managers/exceptions/ManagerSaveException.java +++ b/src/managers/exceptions/ManagerSaveException.java @@ -9,4 +9,8 @@ public ManagerSaveException() { public ManagerSaveException(String message) { super(message); } + + public ManagerSaveException(String message, Throwable cause) { + super(message, cause); + } } From cf4cb1d6e0aee8efd5639d1854884e7cd4b6d463 Mon Sep 17 00:00:00 2001 From: Crodi Date: Thu, 21 Aug 2025 23:54:44 +0300 Subject: [PATCH 07/11] fix: made reading from file safe --- src/managers/FileBackedTaskManager.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/managers/FileBackedTaskManager.java b/src/managers/FileBackedTaskManager.java index 5cfa4a1..982b799 100644 --- a/src/managers/FileBackedTaskManager.java +++ b/src/managers/FileBackedTaskManager.java @@ -7,8 +7,7 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import static model.Type.EPIC; -import static model.Type.TASK; +import static model.Type.*; public class FileBackedTaskManager extends InMemoryTaskManager { @@ -24,7 +23,8 @@ public FileBackedTaskManager(File file) { public static FileBackedTaskManager loadFromFile(File file) { if (!file.exists()) { - /* Если файла не существует, то возвращается пустой менеджер*/ + /* Если файла не существует, то возвращается пустой менеджер + * с возможностью создать файл и записывать в него*/ return new FileBackedTaskManager(file); } @@ -58,8 +58,10 @@ public static FileBackedTaskManager loadFromFile(File file) { manager.addTask(new Task(title, description, status)); } else if (type == EPIC) { manager.addEpic(new Epic(title, description, status)); - } else { + } else if (type == SUBTASK) { manager.addSubTask(new SubTask(title, description, status, Integer.parseInt(parts[5]))); + } else { + System.out.println("Такой формат не существует"); } } /*счетчик устанавливается на максимальный найденный id, From 0a410688df1ded75bc3d4ab6bb96fcbfa16efa99 Mon Sep 17 00:00:00 2001 From: Crodi Date: Fri, 22 Aug 2025 00:44:20 +0300 Subject: [PATCH 08/11] fix: made idCount private and add get/set methods --- src/managers/FileBackedTaskManager.java | 6 +++--- src/managers/InMemoryTaskManager.java | 10 +++++++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/managers/FileBackedTaskManager.java b/src/managers/FileBackedTaskManager.java index 982b799..babcf50 100644 --- a/src/managers/FileBackedTaskManager.java +++ b/src/managers/FileBackedTaskManager.java @@ -24,7 +24,7 @@ public static FileBackedTaskManager loadFromFile(File file) { if (!file.exists()) { /* Если файла не существует, то возвращается пустой менеджер - * с возможностью создать файл и записывать в него*/ + * с возможностью создать файл и записывать в него*/ return new FileBackedTaskManager(file); } @@ -47,7 +47,7 @@ public static FileBackedTaskManager loadFromFile(File file) { * но не знает верного счетчика для каждого таска, * поэтому счетчик устанавливается на id - 1 (то есть предыдущее значение), * а уже в методе добавления счетчик увеличивается на один, устанавливая верное значение */ - manager.idCount = id - 1; + manager.setIdCount(id - 1); Type type = Type.valueOf(parts[1]); String title = parts[2]; @@ -66,7 +66,7 @@ public static FileBackedTaskManager loadFromFile(File file) { } /*счетчик устанавливается на максимальный найденный id, * теперь отсчет id всех новых тасков будет от этого значения*/ - manager.idCount = maxId; + manager.setIdCount(maxId); } catch (IOException e) { e.printStackTrace(); diff --git a/src/managers/InMemoryTaskManager.java b/src/managers/InMemoryTaskManager.java index e48f3b4..f79fb1b 100644 --- a/src/managers/InMemoryTaskManager.java +++ b/src/managers/InMemoryTaskManager.java @@ -11,7 +11,7 @@ import java.util.List; public class InMemoryTaskManager implements TaskManager { - protected int idCount; + private int idCount; private final HashMap tasks = new HashMap<>(); private final HashMap epics = new HashMap<>(); private final HashMap subtasks = new HashMap<>(); @@ -230,6 +230,14 @@ private void clearHistorySubTasks() { } } + public int getIdCount() { + return idCount; + } + + public void setIdCount(int id) { + idCount = id; + } + @Override public List getHistory() { return historyManager.getHistory(); From 7a77cb2ed8a6fc15107176bccae796d9ccd5398c Mon Sep 17 00:00:00 2001 From: Crodi Date: Fri, 22 Aug 2025 01:27:12 +0300 Subject: [PATCH 09/11] feat: add tests for FileBackedTaskManager --- test/managers/FileBackedTaskManagerTest.java | 99 ++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 test/managers/FileBackedTaskManagerTest.java diff --git a/test/managers/FileBackedTaskManagerTest.java b/test/managers/FileBackedTaskManagerTest.java new file mode 100644 index 0000000..98a2ea5 --- /dev/null +++ b/test/managers/FileBackedTaskManagerTest.java @@ -0,0 +1,99 @@ +package managers; + +import managers.exceptions.ManagerSaveException; +import model.Epic; +import model.Status; +import model.SubTask; +import model.Task; +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 static org.junit.jupiter.api.Assertions.*; + +public class FileBackedTaskManagerTest { + private File tempFile; + private FileBackedTaskManager manager; + + @BeforeEach + public void beforeEach() throws IOException { + tempFile = Files.createTempFile("task", ".csv").toFile(); + manager = new FileBackedTaskManager(tempFile); + } + + @Test + public void shouldSaveAndLoad() { + + Task task1 = new Task("task1", "demo1", Status.NEW); // id=1 + manager.addTask(task1); + + Epic epic1 = new Epic("epic1", "demo1", Status.NEW); // id=2 + manager.addEpic(epic1); + Epic epic2 = new Epic("epic2", "demo2", Status.NEW); // id=3 + manager.addEpic(epic2); + + SubTask subTask1 = new SubTask("subtask1", "demo1", Status.NEW, 2); //id=4 + manager.addSubTask(subTask1); + + Task task2 = new Task("task2", "demo2", Status.NEW); // id=5 + manager.addTask(task2); + + manager.deleteTask(1); + + FileBackedTaskManager manager1 = FileBackedTaskManager.loadFromFile(tempFile); + + assertNull(manager1.getTask(1)); + assertEquals(epic1, manager1.getEpic(2)); + assertEquals(epic2, manager1.getEpic(3)); + assertEquals(subTask1, manager1.getSubTask(4)); + assertEquals(subTask1, manager1.getSubTasksFromEpic(2).getFirst()); + assertEquals(task2, manager1.getTask(5)); + assertEquals(manager.getIdCount(), manager1.getIdCount()); + } + + @Test + public void shouldThrowManagerSaveException() { + manager = new FileBackedTaskManager(new File("blablabla/test.txt")); + + assertThrows(ManagerSaveException.class, + () -> { + manager.addTask(new Task("title", "demo", Status.NEW)); + }); + } + + @Test + public void shouldReturnEmptyManager() { + FileBackedTaskManager manager1 = FileBackedTaskManager.loadFromFile(new File("resources/test.txt")); + + assertEquals(0, manager1.getIdCount()); + assertEquals(0, manager1.getTasks().size()); + assertEquals(0, manager1.getEpics().size()); + assertEquals(0, manager1.getSubTasks().size()); + } + + @Test + public void shouldSupportUTF8() { + String[] words = { + "Hello", "World", + "Привет", "Мир", + "Selam", "Dünya", + "你好", "世界", + "👋", "🌎" + }; + + for (int i = 0; i < words.length; i += 2) { + manager.addTask(new Task(words[i], words[i + 1], Status.NEW)); + } + + FileBackedTaskManager manager1 = FileBackedTaskManager.loadFromFile(tempFile); + int id = 1; + for (int i = 0; i < words.length; i += 2) { + Task task = manager1.getTask(id++); + assertEquals(words[i], task.getTitle()); + assertEquals(words[i + 1], task.getDescription()); + } + } +} \ No newline at end of file From 9aeef5afcae6292b60d2de319dfcef89b0177e81 Mon Sep 17 00:00:00 2001 From: Crodi Date: Fri, 22 Aug 2025 01:30:50 +0300 Subject: [PATCH 10/11] fix: add safety for reading and simplify syntax --- src/managers/FileBackedTaskManager.java | 6 +++++- test/managers/FileBackedTaskManagerTest.java | 4 +--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/managers/FileBackedTaskManager.java b/src/managers/FileBackedTaskManager.java index babcf50..b78915e 100644 --- a/src/managers/FileBackedTaskManager.java +++ b/src/managers/FileBackedTaskManager.java @@ -37,7 +37,11 @@ public static FileBackedTaskManager loadFromFile(File file) { int maxId = 0; while (reader.ready()) { - String[] parts = reader.readLine().split(","); + String line = reader.readLine(); + if (line.isBlank()) { + continue; + } + String[] parts = line.split(","); int id = Integer.parseInt(parts[0]); diff --git a/test/managers/FileBackedTaskManagerTest.java b/test/managers/FileBackedTaskManagerTest.java index 98a2ea5..778bb7a 100644 --- a/test/managers/FileBackedTaskManagerTest.java +++ b/test/managers/FileBackedTaskManagerTest.java @@ -59,9 +59,7 @@ public void shouldThrowManagerSaveException() { manager = new FileBackedTaskManager(new File("blablabla/test.txt")); assertThrows(ManagerSaveException.class, - () -> { - manager.addTask(new Task("title", "demo", Status.NEW)); - }); + () -> manager.addTask(new Task("title", "demo", Status.NEW))); } @Test From a7a17dc248a934b2e0f306063bb5a1380758d783 Mon Sep 17 00:00:00 2001 From: Crodi Date: Fri, 22 Aug 2025 01:45:36 +0300 Subject: [PATCH 11/11] fix: codeStyle fix --- src/managers/FileBackedTaskManager.java | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/managers/FileBackedTaskManager.java b/src/managers/FileBackedTaskManager.java index b78915e..7ce1cc6 100644 --- a/src/managers/FileBackedTaskManager.java +++ b/src/managers/FileBackedTaskManager.java @@ -11,26 +11,23 @@ public class FileBackedTaskManager extends InMemoryTaskManager { - /*первая служебная строка файла*/ - private final static String FIRST_LINE = "id,type,name,status,description,epic"; + private final File filename; - private final File FILE; - - public FileBackedTaskManager(File file) { - this.FILE = file; + public FileBackedTaskManager(File filename) { + this.filename = filename; } - public static FileBackedTaskManager loadFromFile(File file) { + public static FileBackedTaskManager loadFromFile(File filename) { - if (!file.exists()) { + if (!filename.exists()) { /* Если файла не существует, то возвращается пустой менеджер * с возможностью создать файл и записывать в него*/ - return new FileBackedTaskManager(file); + return new FileBackedTaskManager(filename); } - FileBackedTaskManager manager = new FileBackedTaskManager(file); + FileBackedTaskManager manager = new FileBackedTaskManager(filename); - try (BufferedReader reader = new BufferedReader(new FileReader(file, StandardCharsets.UTF_8))) { + try (BufferedReader reader = new BufferedReader(new FileReader(filename, StandardCharsets.UTF_8))) { reader.readLine(); // пропуск первой служебной строки /*конечный id, который будет присвоен idCount(далее счетчик) в manager*/ @@ -81,8 +78,8 @@ public static FileBackedTaskManager loadFromFile(File file) { private void save() { - try (BufferedWriter bw = new BufferedWriter(new FileWriter(FILE, StandardCharsets.UTF_8))) { - bw.write(FIRST_LINE); + try (BufferedWriter bw = new BufferedWriter(new FileWriter(filename, StandardCharsets.UTF_8))) { + bw.write("id,type,name,status,description,epic"); //первая служебная строка файла bw.newLine(); writeTasks(bw, super.getTasks()); // записываются таски