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

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

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

Другой возможный способ решить эту проблему — создать способ перечисления всех отдельных файлов в папке (включая все файлы в подпапках), и я мог бы легко вписать это в свою программу.

Я пытался использовать помеченные ключевые слова continue, return и break на основе ответа, который я получил в Интернете, но я никогда не ожидал, что им удастся вернуть мой код обратно в определенное место.

JFileChooser chooser = new JFileChooser();
chooser.setSelectedFiles(null);
                chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
chooser.showOpenDialog(null);

//Getting file paths from within folder
File f = chooser.getSelectedFile();
String file = f.getAbsolutePath();

if (f.isDirectory()) {
//Need to loop back to here
File folder = new File(file);
File[] listOfFiles = folder.listFiles();

for (int i = 0; i < listOfFiles.length; i++) {

if (listOfFiles[i].isDirectory()) {
//Code here is run if there is a folder within a folder. I tested it too
//I want the code here to loop back above where it says "Need to loop back to here"
}

if (listOfFiles[i].isFile()) { //Once I list the files from within the folder, their information gets assigned variable here, and the rest of my program sorts it and saves it to DB accordingly.                           

//Everything below here is not important, but it might be helpful to see what happens each file with the folders.                   
System.out.println(listOfFiles[i]);

String filename = (listOfFiles[i].getName()); //For Files
Long filemodified = (listOfFiles[i].lastModified());
String filepath = (listOfFiles[i].getAbsolutePath());
Long filesizeraw = (listOfFiles[i].length());
long filehashcode = (listOfFiles[i].hashCode());
String fileparent = (listOfFiles[i].getParent());

В настоящее время сообщения об ошибке нет. Он будет обрабатывать любые отдельные файлы непосредственно в импортированном файле (не вложенном ни в одну папку внутри папки), но не будет обращаться ни к одному из файлов, находящихся в папках внутри папок.

Вы уже используете циклы for. Как насчет в то время как циклы и всех других структур управления, доступных в java? Переполнение стека — не лучшее место для ответов на полные руководства по основным методам программирования.

C Perkins 25.07.2019 06:12

Одним из решений является рефакторинг вашего кода и использование рекурсии.

GirishB 25.07.2019 06:15

@CPerkins Я знаю, как использовать циклы while, и я не думаю, что это подходит для того, что я пытаюсь сделать. Возможно, вы неправильно прочитали мой вопрос, не могли бы вы взглянуть на него еще раз?

John Peabody 25.07.2019 07:16

Предложение рекурсии @JohnPeabody GirishB - хорошее решение. Рекурсия может принимать форму одной функции или может быть реализована с помощью объектов и методов. Но формальное изучение рекурсии показывает, что многие (большинство?) рекурсивных алгоритмов можно развернуть в базовые циклы. Если циклы while (и for, if и т. д.), функции и объекты не могли решить проблему, то поиск какого-то нового скрытого аспекта языка может обернуться разочарованием. Ваш вызов законен, просто существует так много способов сделать это, что он, вероятно, слишком широк для вопроса SO.

C Perkins 25.07.2019 07:32

Если вы не хотите делать рекурсию (что, вероятно, является правильным), я думаю, что @CPerkins пытается понять это. Добавьте свой основной каталог в список неисследованных каталогов. Затем пока(список неисследованных каталогов не пуст){убрать первый из списка. Просмотрите все его файлы, делая все, что вам нужно, с фактическими файлами и добавляя все найденные каталоги в ваш список неисследованных каталогов}

Jeremy Kahan 25.07.2019 07:49

Изучив новый раздел «Как спрашивать» и другие справочные страницы, я решил, что, возможно, я слишком ограничителен, и поэтому начал набрасывать ответ... но, как я и опасался, я обнаружил, что начинаю объяснять переменную область видимости, инкапсуляцию данных, основы определения функций и когда отдельные функции наиболее полезны... все для того, чтобы правильно объяснить рекурсию. Он начинает становиться полноценным учебником по программированию. Это не грубость, а только указание на то, что вопрос заголовка действительно настолько фундаментален, что нет короткого ответа, кроме «попробовать рекурсию» или «попробовать цикл while».

C Perkins 25.07.2019 08:10

@CPerkins спасибо вам обоим за ответы. Рекурсия, безусловно, правильный путь. У меня есть приличный опыт с ним, и я использую его сейчас. Просто боль переписать кучу кода.

John Peabody 25.07.2019 08:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
7
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Another possible way to solve this issue would be to create a way to list out all of the individual files within folder (including all the files within subfolders), and I could easily fit that into my program too

Хотя это не делает вставки SQLite, следующий класс извлекает список (объектов File) файлов (таким образом, имя файла и путь доступны через объект File).

public class FTS {

    private ArrayList<File> mFileList; //Resultant list of Files extracted
    private String mBaseDirectory; // The Directory to search
    private long mSubDirectoryCount; // The count of the subdirectories

    //Constructor
    public FTS(String directory) {
        this.mBaseDirectory = directory;
        this.mSubDirectoryCount = 0;
        buildFileListing(this.mBaseDirectory);
    }

    //
    private void buildFileListing(String directory) {
        // Initialise the ArrayList for the result
        if (mFileList == null) {
            mFileList = new ArrayList(){};
        }
        //Get the File (directory to process)
        File dir = new File(directory);
        // Get the List of the Directories contents
        String[] filelist = dir.list();
        // If empty (null) then return
        if (filelist == null) {
            return;
        }
        // Loop through the directory list
        for (String s: filelist) {
            //get the current list item as a file
            File f = new File(dir.getAbsolutePath() + File.separator + s);
             // is it a file or directory?
            if (f.isFile() && !f.isDirectory()) { 
                this.mFileList.add(f);  // If a file then add the file to the extracted list
            } else {
                // If a directory then increment the count of the subdirectories processed
                mSubDirectoryCount++;
                // and then recursively call this method to process the directory
                buildFileListing(f.getAbsolutePath());
            }
        }
    }

    // return the list of extracted files
    public ArrayList<File> getFileList() {
        return this.mFileList;
    }

    // return the number of sub-directories processed
    public long getSubDirectoryCount() {
        return this.mSubDirectoryCount;
    }
}

Пример использования вышеизложенного: -

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
       FTS fileTreeSearch;
       String BaseDirectory = "E:" + File.separator;
       List<File> files = (fileTreeSearch = new FTS(BaseDirectory)).getFileList();
       System.out.println("Extracted " + String.valueOf(files.size()) + " files, from " + String.valueOf(fileTreeSearch.getSubDirectoryCount()) + " sub-directories of " + BaseDirectory);
       /* this commented out code would process all the extracted files
       for (File f: files) {
           System.out.println("File is " + f.getName() + "\t\t path " + f.getAbsolutePath());
       } 
       */
    }
}

Пример вывода при выполнении вышеизложенного: -

Extracted 186893 files, from 54006 sub-directories of E:\

Спасибо! Это сработало отлично. Ваш код ясен, легко читается и эффективен.

John Peabody 30.07.2019 04:12

Другие вопросы по теме