-1

Не могу продумать грамотное построение конструкции для обработки того, что я в вводе при запуске программы могу указать путь к файлу всё, что угодно, а ошибку он не выкидывает. (запись в файл списков).

case 8:
    System.out.println("Введите путь и имя файла: " + scanner.nextLine());
    String filePath = scanner.nextLine();
    try (FileWriter writer = new FileWriter(filePath)) {
        for (Point line : points) {
            writer.write(line + System.lineSeparator());
        }
        System.out.println("Данные успешно записаны в файл.");
    } catch (IOException e) {
        System.out.println("Ошибка при записи данных в файл: " + e.getMessage());
    }
break;

введите сюда описание изображения

Nowhere Man
  • 15,995
  • 33
  • 19
  • 29
  • Файл создаётся в репозитории проекта, но не видим внутри проекта в Eclipse + не имеет расширения, хотя текстовые редакторы (Notepad) содержимое видят – Flynik ForLive Nov 22 '23 at 18:57
  • 1
    "Всё, что угодно" - нет, это не так. Файлы с именами abc, 1232 и прочими подобными - это вполне себе файлы, даже без расширений, поэтому ошибки и нет. Она возникнет, только если имя файла будет некорректным с точки зрения файловой системы. Например, будет содержать : в названии. Если вам не нравится возможность ввода таких файлов, то можете вручную проверить наличие расширения простым lastIndexOf("."). Хотя это не спасёт от ввода каких-нибудь безумных расширений, на этот случай можете ещё проверять расширение, например, чтобы оно было только .txt. – Byb Nov 22 '23 at 19:40
  • Ошибка не обрабатывается потому что файл создается, так как вы не вводите путь к файлу, попробуйте ввести следующий путь и ошибка воспроизведется - A:/file.txt – AlekseiGaile Nov 22 '23 at 19:42
  • Не понимаю способ решения проблемы через lastIndexOf(".") – Flynik ForLive Nov 22 '23 at 20:08
  • А какой смысл сканирования строки в System.out.println("Введите путь и имя файла: " + scanner.nextLine());? Если файлы успешно создаются, какую ошибку вы ожидаете? Если у файла обязателььно расширение, можете его добавить самостоятельно. – Nowhere Man Nov 22 '23 at 21:19
  • Программа сразу выдаёт ошибку без этой строчки, не давая ничего сделать – Flynik ForLive Nov 23 '23 at 06:22
  • Понятно, здесь ещё и классический дубликат: Особенности использования scanner.nextLine() – Nowhere Man Nov 23 '23 at 08:52

1 Answers1

2

FileWriter выдаст ошибку только в том случае, если имя файла не будет корректным для файловой системы. То есть для того, чтобы было выброшено исключение IOException, имя файла либо должно содержать запрещённые символы типа <, > и прочих, либо являться некорректным путём типа ABC:/text.txt.

Файлы же без расширений - как asd, который вы ввели в качестве теста - это обычные файлы для файловой системы, поэтому ошибка и не возникает.

Вы можете самостоятельно проверить наличие расширения у файла. Сделать это можно по-разному. Например, так:

int lastIndexOf = filePath.lastIndexOf(".");
if (lastIndexOf == -1 || filePath.substring(lastIndexOf + 1).isEmpty()) {
    // something
}

Внутри этого блока if вы можете бросить своё собственное исключение и отлавливать его в try вместе с IOException, или сделать как-то иначе.

Однако это не спасает от сомнительных расширений типа .abcdef. На этот случай можете составить список "разрешённых" расширений файлов:

List<String> extensions = List.of(
    "txt",
    "xml",
    "json"
); // список можно продолжать

Тогда проверку корректности имени файла можно усовершенствовать следующим образом:

int lastIndexOf = filePath.lastIndexOf(".");
if (lastIndexOf == -1 || !extensions.contains(filePath.substring(lastIndexOf + 1))) {
    // something
}
Byb
  • 2,318