我有一个程序,可以读取多个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目录,但是如果我的用户选择允许我的用户指定数据的绝对路径?
答案 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();
}
}