Kotlin:获取资源文件夹中所有文件的列表

时间:2018-03-22 03:17:53

标签: kotlin resources

有没有办法获取Kotlin“resources”文件夹中所有文件的列表?

我可以将特定文件读为

Application::class.java.getResourceAsStream("/folder/filename.ext")

但有时我只是想从文件夹“folder”中提取所有内容。

谢谢。

3 个答案:

答案 0 :(得分:2)

没有方法(即Application::class.java.listFilesInDirectory("/folder/")),但您可以创建自己的系统来列出目录中的文件:

@Throws(IOException::class)
fun getResourceFiles(path: String): List<String> = getResourceAsStream(path).use{
    return if(it == null) emptyList()
    else BufferedReader(InputStreamReader(it)).readLines()
}

private fun getResourceAsStream(resource: String): InputStream? = 
        Thread.currentThread().contextClassLoader.getResourceAsStream(resource) 
                ?: resource::class.java.getResourceAsStream(resource)

然后只需致电getResourceFiles("/folder/"),您就会获得该文件夹中的文件列表,假设它在类路径中。

这是有效的,因为Kotlin有一个扩展函数,可以将行读入字符串列表。声明是:

/**
 * Reads this reader content as a list of lines.
 *
 * Do not use this function for huge files.
 */
public fun Reader.readLines(): List<String> {
    val result = arrayListOf<String>()
    forEachLine { result.add(it) }
    return result
}

答案 1 :(得分:0)

两个不同的部分:

  1. 获取代表资源目录的文件
  2. 遍历目录

对于1,您可以使用Java的getResource

val dir = File( object {}.javaClass.getResource(directoryPath).file )

对于2,您可以使用Kotlin的File.walk扩展功能,该功能返回sequence可以处理的文件,例如:

dir.walk().forEach { f ->
    if(f.isFile) {
        println("file ${f.name}")
    } else {
        println("dir ${f.name}")
    }
}

答案 2 :(得分:-1)

这是我找到的一个非常简单的解决方案。

File("/path/to/file.txt")
    // make an iterable file tree
    .walk()
    // only files no directories
    .filter { it.isFile }
    // last modified from top to bottom (most recent on top)
    .sortedByDescending { it.lastModified() }
    // do things on the files
    .forEachIndexed {
        i, it ->
        // use the most recent file and delete the other ones
        if (i == 0) {
            useMe(it)
        } else {
            it.delete()
        }
    }