@vega2475

Как можно текст который находится в консоли преобразовать в строку?

Мне нужно сделать так что бы при печати результата программы в методе solve, распечатка шла в gui (swing), а не в консоль, сделать так что бы это все записывалось в строку у меня не получается так как там рекурсия и сделать метод Recursion типа String я не могу. Можно ли как-то изменить поток вывода? Не System.out.println, а так что бы выводилось в gui? Или можно ли как-то то что распечатается в консоли преобразовать в String?(Как-то вытащмть данные из консоли в типе String)?

Метод solve (я попробовал добавить StringBuilder в классе, но при вызове его он пустой, так как считввается в начале работы программы.

import java.io.File;

public class Solution {

    static int deepestLevelDigit = 0;

    static StringBuilder sb = new StringBuilder();

    static public int deepestLevel(File folder) {
        int currentLevel;
        File[] folderEntries = folder.listFiles();
        for (File entry : folderEntries) {
            currentLevel = countMatches(entry.getPath());
            if (entry.isDirectory()) {
                deepestLevel(entry);
            }
            if (deepestLevelDigit < currentLevel) {
                deepestLevelDigit = currentLevel;
            }
        }
        return deepestLevelDigit - 1;
    }

    private static int countMatches(String path) {
        int number = 0;
        String[] array = path.split("");
        for (int i = 0; i < path.length(); i++) {
            if ("\\".contentEquals(array[i])) {
                number++;
            }
        }
        return number;
    }


    static void RecursivePrint(File[] arr, int index, int level, File dir) {
        //для возвращения к главной рекурсии
        if (index == arr.length)
            return;

        // для файлов
        if (arr[index].isFile() && level == deepestLevel(dir)) {
            sb.append((arr[index].getName()));
            System.out.println(arr[index].getName());
        }

        // рекурсия для подпапок (на поиск)
        else if (arr[index].isDirectory() && level == deepestLevel(dir)) {
            sb.append(arr[index].getName());
            System.out.println("[" + arr[index].getName()
                    + "]");
        }
        if (arr[index].isDirectory()) {
            // рекурсия для "погружения"
            RecursivePrint(arr[index].listFiles(), 0,
                    level + 1, dir);
        }

        // для главной папки
        RecursivePrint(arr, ++index, level, dir);
    }

    public static void solve(String mainDirPath) {


        File mainDir = new File(mainDirPath);

        System.out.println("Максимальная глубина " + deepestLevel(mainDir));

        if (mainDir.exists() && mainDir.isDirectory()) {

            File[] arr = mainDir.listFiles();

            if (arr == null) {
                System.out.println(mainDir);
            }


            RecursivePrint(arr, 0, 0, mainDir);

        }


    }
}


import javax.swing.*;

public class GuiForm extends JFrame {
    private JTextField inputPath;
    private JButton Button;
    private JTextArea output;
    private JPanel panelMain;

    public GuiForm() {
        this.setTitle("FrameMain");
        this.setContentPane(panelMain);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();

        Button.addActionListener(e -> {
            try {
                JOptionPane.showMessageDialog(null, "В выводе папки заключены в квадратные скобки [], а файлы просто");
                String pathToDir = inputPath.getText();
                output.setText(Solution.solve(pathToDir)); <- вот тут мне нужен результат в виде String или что бы сразу печаталось в gui в методе solve так где Sout.
            }
            catch (Exception err) {
                JOptionPane.showMessageDialog(null, "Некорректные данные", "Ошибка", JOptionPane.ERROR_MESSAGE);
            }
        });


    }

}
  • Вопрос задан
  • 236 просмотров
Пригласить эксперта
Ответы на вопрос 1
@dp_ua
Конечно можно.
Создай перед запуском функции с рекурсией отдельный объект, который ты будешь использовать для накопления данных о работе своей функции. Пусть это StringBuilder будет, например.
И вместо вывода на экран просто складывай данные в него. И потом его же передавай в свинг
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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