javajava-9nosuchfileexception

java 9 resource file different module NoSuchFileException


I am trying to load a file which is present in the resources folder, but getting an exception. I am using java 9, and the java file that has the code to read the file is present in some other module and the calling code is in some other module. Can some one please suggest how to proceed here?

enter image description here

Exception stacktrace

java.nio.file.NoSuchFileException: genome-tags.csv
    at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:85)
    at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
    at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108)
    at java.base/sun.nio.fs.WindowsFileSystemProvider.newByteChannel(WindowsFileSystemProvider.java:231)
    at java.base/java.nio.file.Files.newByteChannel(Files.java:364)
    at java.base/java.nio.file.Files.newByteChannel(Files.java:410)
    at java.base/java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384)
    at java.base/java.nio.file.Files.newInputStream(Files.java:154)
    at java.base/java.nio.file.Files.newBufferedReader(Files.java:2809)
    at java.base/java.nio.file.Files.readAllLines(Files.java:3239)
    at java.base/java.nio.file.Files.readAllLines(Files.java:3279)
    at com.bhargo.filesystem.reader/com.bhargo.filesystem.reader.FileSystemReader.read(FileSystemReader.java:15)
    at com.bhargo/com.bhargo.Main.main(Main.java:20)

The code is:-

    public class Main {

        public static void main(String[] args) {
            ServiceLoader<IReader> serviceLoader = ServiceLoader.load(IReader.class);
            try {
                System.out.println(serviceLoader.iterator().next().read("genome-tags.csv", Main.class).size());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    public interface IReader {
    List<String> read(String fileLocation, Class clazz) throws IOException;

    default File getFile(String fileLocation, Class clazz) {
        URL url = clazz.getResource(fileLocation);
        return new File(getClass().getClassLoader().getResource(fileLocation).getFile());
    }
}


    public class FileSystemReader implements IReader{
        @Override
        public List<String> read(String fileLocation, Class clazz) throws IOException {
            return Files.readAllLines(Paths.get(getFile(fileLocation, clazz).getName()));
        }
    }

Thanks,

Amar


Solution

  • Change

    public class FileSystemReader implements IReader{
            @Override
            public List<String> read(String fileLocation, Class clazz) throws IOException {
                return Files.readAllLines(Paths.get(getFile(fileLocation, clazz).getName()));
            }
        }
    

    to

    public class FileSystemReader implements IReader{
            @Override
            public List<String> read(String fileLocation, Class clazz) throws IOException {
                return Files.readAllLines(Paths.get(getFile(fileLocation, clazz).getAbsolutePath()));
            }
        }