如何从用户提供的Java输入中查找文件

时间:2019-02-13 01:12:46

标签: java file

我有一个程序,可以读取多个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 :(得分:0)

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();
}

答案 1 :(得分:0)

这很简单:

        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();
        }
    }