Reputation: 1989
My Maven web service project has this basic structure:
MyWebService\
|-- src\
| |-- main\
| | |-- java\
| | `-- resources\
| | `-- csvfiles\
| | `-- data.csv
| `-- test\
`-- target\
|-- classes\
`-- test-classes\
I am trying to access the .csv files in the csvfiles
subdirectory of my resources
subdirectory.
I have a class with this code:
public class ReadCSVFiles {
public void read(){
String separator = System.getProperty("file.separator");
ClassLoader cl = ReadCSVFiles.class.getClassLoader();
URL url = cl.getResource(separator + "src" + separator + "main" + separator + "resources" + separator + "csvfiles" + "data.csv");
url.toString();
}
}
The path ends up being:
\src\main\resources\csvfiles\data.csv
I also tried this path:
src\main\resources\csvfiles\data.csv
Whenever I run my application, I always get a NullPointerException
on the url.toString()
line.
So, how do I go about getting access to those .csv data files?
Upvotes: 0
Views: 165
Reputation: 1573
First of all I'm not sure why do you want to print the URL here, the classLoader.getResource has taken your resource directory as the root here. If you want to read the CSV and do some action on that that file then directly read the file using an InputStream.
Like the below
public class ReadCSVFiles {
public void read(){
String separator = System.getProperty("file.separator");
ClassLoader cl = ReadCSVFiles.class.getClassLoader();
try (InputStream inputStream = cl.getResourceAsStream("csvfiles/data.csv")) {
InputStreamReader streamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
BufferedReader reader = new BufferedReader(streamReader);
for (String line; (line = reader.readLine()) != null;) {
// Process line
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Or if you need to get the URL and then load the file through the URL you can try something like below
URL url = cl.getResource("csvfiles/data.csv");
Path path = Paths.get(url.toURI());
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
Upvotes: 0
Reputation: 1154
If you're using the classloader to get a resource in the classpath (resources folder), just use the relative path:
ReadCSVFiles.class.getClassLoader().getResource("csvfiles/data.csv");
Upvotes: 1