Как найти файл из пользовательского ввода в Java - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть программа, которая читает несколько файлов json, а затем проводит анализ информации, содержащейся в этих файлах.

Структура моего проекта выглядит следующим образом:

    /main
        /java
        /resources
            /data
                file1.json
                file2.json
                ...
                fileN.json

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

Я использую следующий код для создания массива объектов File:

 ClassLoader loader = myClass.class.getClassLoader();
 URL url = loader.getResource(location);
 try {
     String path = url.getPath();
     return new File(path).listFiles();
} catch (NullPointerException e) {
     throw new FileNotFoundException();
}

Примечание: я использую myClass.class.getClassLoader (), потому что я звоню изстатический метод, а не из экземпляра объекта.

Это успешно работает, когда location = "data".Однако, если я передам абсолютный путь в другое место (например: location = "/Users/myuser/Desktop/data"), в котором есть те же файлы данных, я получу NPE.

Есть ли хороший способ, который позволит мне использовать каталог src / main / resources по умолчанию, но позволит моему пользователю указать абсолютный путь к данным, если они выберут?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Это очень просто:

        ClassLoader cl = myClass.class.getClassLoader();
        URL url = cl.getResource(location);
        if (url == null) {
            //the location does not exist in class path
            return new File(location).listFiles();
        } else {
            return new File(url.getPath()).listFiles();
        }

Но я думаю, что лучший способ это:

    private File[] readFile(String userLocation) {
        if(userLocation == null || userLocation.isEmpty()) {
            // user do not specify the path
            return new File(myClass.class.getResource("data").getPath()).listFiles();
        } else {
            return new File(userLocation).listFiles();
        }
    }
0 голосов
/ 13 февраля 2019
ClassLoader loader = myClass.class.getClassLoader();
URL url = loader.getResource(location);

Приведенный выше код работает только с файлами, которые существуют в вашем пути к классам.Таким образом, вы можете изменить его на чтение из каталога src / main / resources по умолчанию и указать абсолютный путь, заданный пользователем, обновив его следующим образом:

try {
     return new File(location).listFiles();
} catch (NullPointerException e) {
     throw new FileNotFoundException();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...