【问题标题】:java 9 resource file different module NoSuchFileExceptionjava 9资源文件不同模块NoSuchFileException
【发布时间】:2017-11-05 12:44:43
【问题描述】:

我正在尝试加载资源文件夹中存在的文件,但出现异常。 我正在使用java 9,具有读取文件代码的java文件存在于其他模块中,调用代码位于其他模块中。 有人可以建议如何在这里进行吗?

异常堆栈跟踪

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)

代码是:-

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

谢谢,

阿马尔

【问题讨论】:

  • 这一行return new File(getClass().getClassLoader().getResource(fileLocation).getFile()); 尝试使用absoluatePath()
  • 基于异常,getName() 只返回文件名...尝试调用 .getAbsolutePath() 应该打印包含名称的完整路径。添加一个 system.out.println() 看看这是什么值?顺便说一句,如果您的文件很大,将所有行读入 List 可能不是一个好主意。您应该考虑使用流。
  • 将 Files.readAllLines(Paths.get(getFile(fileLocation, clazz).getName())) 更改为 Files.readAllLines(Paths.get(getFile(fileLocation, clazz).getAbsolutePath()))现在它可以工作了
  • 好一个。请接受答案以完成您的问题。谢谢。
  • 但是new File 绕道的意义何在?在 所有 Java 版本中,这是错误的语义。 clazz.getResource(…) 已经返回一个可读的URL,不一定是file: URL。如果你想从那里转向 NIO,你可以简单地使用Paths.get(url.toURI()) 将其转换为路径,尽管使用url.openStream()(或首先使用getResourceAsStream())并阅读它而不是依赖它更可靠FileSystem 实现...

标签: java java-9 nosuchfileexception


【解决方案1】:

改变

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    相关资源
    最近更新 更多