@DiseaseC

Почему при выводе в консоль и в текстовый файл выводятся разные значения?

В коде несколько раз нужно записывать что-то в файл - запись происходит в void main и в одной функции внутри void main. Во вложенной функции при выводе в консоль всё красиво, а в файл вывести тоже самое просто не получается - либо выводится мусор из обрывков того, что было в консоли, либо не выводится ничего (зависит от того, где инициализировать FileWriter). Нужен совет, как это всё организовать или в чём может быть проблема?

public class Main {
    public static void main(String[] args) throws IOException {

        FileWriter err = new FileWriter("error.txt");

        myFunction(args);
        //some logic
     
        err.write(something);

        err.close();
    }

    private static void myFunction(String url) throws IOException {
        FileWriter er = new FileWriter("error.txt");

        if (some condition) {
            er.write(url + " " + statusCode + "\n"); //вообще ничего не пишет в файл
            System.err.println(url + " " + statusCode); //выводит всё как надо
            return;
        }
        er.close();
        }
    }
}
  • Вопрос задан
  • 130 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
Потому что return завершает работу метода, er.close() не вызывается и запись в файл не происходит.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
xez
@xez Куратор тега Java
TL Junior Roo
Почитайте про SOLID (https://ru.wikipedia.org/wiki/SOLID_(%D0%BE%D0%B1%...

Там буква S - single responsibility (Принцип единственной ответственности).
Старайтесь писать методы и классы которые будут выполнять только какую-то одну функцию.

В вашем случае myFunction не должен уметь писать в файл - ему достаточно будет уметь обрабатывать входящую строку. Выглядеть это будет, примерно, так:
private static String myFunction(String url) {
        if (some condition) {
            System.err.println(url + " " + statusCode); // Видимо, логирование в консоль
            return url + " " + statusCode + "\n"; // Возврат результата
        }
        return "";    // Это же пример, верно?))
    }


И основной код:
public static void main(String[] args) throws IOException {

        FileWriter err = new FileWriter("error.txt");

        String result = myFunction(args);
        er.write(result);
        //some logic
     
        err.write(something);

        err.close();
    }


В этом варианте myFunction ничего не знает о том куда писать результат своей работы. Сегодня вы хотите писать в файл, завтра в бд, а потом окажется, что достаточно вывести в консоль. Ваша функция будет оставаться неизменной в любом случае.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы