当前位置: 代码迷 >> java >> 读取目录的类路径资源时,行分隔符是什么?
  详细解决方案

读取目录的类路径资源时,行分隔符是什么?

热度:103   发布时间:2023-07-17 20:38:53.0

我正在编写一些Java代码,以流的形式将Classpath的子目录中的文件列出。

InputStream is = YourClazz.class.getClassLoader().getResourceAsStream("subdirectory/")

这将返回一个InputStream ,然后我将其转换为String

String fileNames = "";
try (final Scanner scanner = new Scanner(is).useDelimiter("\\A")) {
    fileNames = scanner.hasNext() ? scanner.next() : "";
}

然后,我使用System.getProperty("line.seperator")读取行并与平台无关。

for (String fileName : fileNames.split(System.getProperty("line.separator"))) {
    // todo
}

但是它在Windows上失败,因为fileNames的分隔符为\\n而不是line.separator 这是因为Scanner吗? 我从得到了这种

根据以下答案进行更新 ,我现在正在使用此代码,该代码可在Windows和Linux上运行:

InputStream in = YourClazz.class.getClassLoader().getResourceAsStream("subdirectory/")
try (final Scanner scanner = new Scanner(in)) {
    while (scanner.hasNextLine()) {
        final String fileName = scanner.nextLine();
        // todo
    }
}

不要手动处理分割线。 让Scanner为您完成。

List<String> lines = new ArrayList<>();
try (final Scanner scanner = new Scanner(is)) {
    while(scanner.hasNextLine()){
        lines.add(scanner.nextLine());
        //or handle that line here instead of storing it in list
    }
}

最好将getResourceAsStream()理解为getResource().openStream() ,换句话说,它在尝试访问目录时提供的内容是完全未指定的,并留给特定的URL协议处理程序使用。 例如,如果上下文是Jar文件,则查找目录通常会失败。 如果上下文是http资源,则尝试获取目录可能会产生index.html的内容。 某些协议(例如ftp )可能始终使用/作为分隔符,而其他协议则可能使用系统的文件分隔符。

唯一的故障安全方法不是尝试查找目录而是文件资源,然后使用从结果中抽象出来的API,该API允许解析相对于结果的路径并列出目录。 从Java 7开始就存在这样的API:

URI clURI = Object.class.getResource("Object.class").toURI();
if(!clURI.getScheme().equals("file")) try {
    FileSystems.getFileSystem(clURI);
} catch(FileSystemNotFoundException ex) {
    FileSystems.newFileSystem(clURI, Collections.<String,Object>emptyMap());
}
for(Path p: Files.newDirectoryStream(Paths.get(clURI).getParent())) {
  System.out.println(p.toUri());
}

这将列出与java.lang.Object处于同一包中的所有(虚拟)文件,通常是jar资源,对于该jar资源,基于URL的目录查找失败。 对于其他class地点,其工作方式类似。 请注意,它根本不依赖于特定的分隔符。

您将需要使用:

 Path path = Paths.get(fileName);
 String[] files = fileName.split(path.getFileSystem().getSeparator());

编辑:我不好,我错误地得到了这个问题。 这将使文件分隔符而不是根据需要的行分隔符。

  相关解决方案