问题描述
我正在编写一些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
}
}
1楼
不要手动处理分割线。 让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
}
}
2楼
最好将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
地点,其工作方式类似。
请注意,它根本不依赖于特定的分隔符。
3楼
您将需要使用:
Path path = Paths.get(fileName);
String[] files = fileName.split(path.getFileSystem().getSeparator());
编辑:我不好,我错误地得到了这个问题。 这将使文件分隔符而不是根据需要的行分隔符。