如何从Kotlin中的资源中读取文本文件?

时间:2017-03-11 19:45:56

标签: kotlin

我想在Kotlin写一个Spek测试。测试应该从src/test/resources文件夹中读取HTML文件。怎么做?

class MySpec : Spek({

    describe("blah blah") {

        given("blah blah") {

            var fileContent : String = ""

            beforeEachTest {
                // How to read the file file.html in src/test/resources/html
                fileContent = ...  
            }

            it("should blah blah") {
                ...
            }
        }
    }
})

12 个答案:

答案 0 :(得分:68)

#import numpy as np

def impl(i,row):
    if row:
        uH = u[:][:] # this copys the array 'u'
        for j in range(1, xmax-1):
            u[i][j] = a*uH[i][j-1]+(1-2*a)*uH[i][j]+a*uH[i][j+1]
        u[i][0] = u[i][0]/b
        for x in range(1, xmax):
            u[i][x] = (u[i][x]+a*u[i][x-1])/(b+a*c[x-1])
        for x in range(xmax-2,-1,-1):
            u[i][x]=u[i][x]-c[x]*u[i][x+1]
    else:
        uH = u[:][:] # this copys the array 'u'
        for j in range(1, xmax-1):
            u[j][i]= a*uH[j-1][i]+(1-2*a)*uH[j][i]+a*uH[j+1][i]
        u[0][i] = u[0][i]/b
        for y in range(1, xmax):
            u[y][i] = (u[y][i]+a*u[y-1][i])/(b+a*c[y-1])
        for y in range(xmax-2,-1,-1):
            u[y][i]=u[y][i]-c[y]*u[y+1][i]

#Init
xmax = 101
tmax = 2000
D = 0.5
l = 1
tSec = 0.1
uH = [[0.0]*xmax]*xmax #np.zeros((xmax,xmax))
u = [[0.0]*xmax]*xmax #np.zeros((xmax,xmax))
dx = l / xmax
dt = tSec / tmax
a = (D*dt)/(dx*dx);
b=1+2*a
print("dx=="+str(dx))
print("dt=="+str(dt))
print(" a=="+str(a))
#koeficient c v trojdiagonalnej matici
c = [-a]*xmax #np.full(xmax,-a)
c[0]=c[0]/b
for i in range(1, xmax):
    c[i]=c[i]/(b+a*c[i-1])
uH[50][50] = 10000
u = uH
for t in range(1, tmax):
    if t % 2 == 0:
        for i in range(0,xmax):
            impl(i,False)
    else:
        for i in range(0, xmax):
            impl(i,True)

答案 1 :(得分:21)

另一个稍微不同的解决方案:

@Test
fun basicTest() {
    "/html/file.html".asResource {
        // test on `it` here...
        println(it)
    }

}

fun String.asResource(work: (String) -> Unit) {
    val content = this.javaClass::class.java.getResource(this).readText()
    work(content)
}

答案 2 :(得分:11)

略有不同的解决方案:

class MySpec : Spek({
    describe("blah blah") {
        given("blah blah") {

            var fileContent = ""

            beforeEachTest {
                html = this.javaClass.getResource("/html/file.html").readText()
            }

            it("should blah blah") {
                ...
            }
        }
    }
})

答案 3 :(得分:11)

不知道为什么这么难,但是我发现的最简单的方法(无需引用特定的类)是

fun getResourceAsText(path: String): String {
    return object {}.javaClass.getResource(path).readText()
}

然后传入一个绝对URL,例如

val html = getResourceAsText("/www/index.html")

答案 4 :(得分:5)

private fun loadResource(file: String) = {}::class.java.getResource(file).readText()

答案 5 :(得分:2)

这是我更喜欢的方式:

fun getResourceText(path: String): String {
    return File(ClassLoader.getSystemResource(path).file).readText()
}

答案 6 :(得分:1)

科特林+春季之路:

@Autowired
private lateinit var resourceLoader: ResourceLoader

fun load() {
    val html = resourceLoader.getResource("classpath:html/file.html").file
        .readText(charset = Charsets.UTF_8)
}

答案 7 :(得分:1)

这个顶级 kotlin 函数将在任何情况下完成这项工作

fun loadResource(path: String): URL {
    return Thread.currentThread().contextClassLoader.getResource(path)
}

或者如果你想要一个更健壮的功能

fun loadResource(path: String): URL {
    val resource = Thread.currentThread().contextClassLoader.getResource(path)
    requireNotNull(resource) { "Resource $path not found" }
    return resource
}

答案 8 :(得分:0)

val fileContent = javaClass.getResource("/html/file.html").readText()

答案 9 :(得分:0)

您可能会发现File类很有用:

import java.io.File

fun main(args: Array<String>) {
  val content = File("src/main/resources/input.txt").readText()
  print(content)
} 

答案 10 :(得分:0)

使用Google Guava库Resources class

import com.google.common.io.Resources;

val fileContent: String = Resources.getResource("/html/file.html").readText()

答案 11 :(得分:0)

仅供参考:在上述所有情况下。 getResource() 是使用 nullable 的不安全方式。

没有在本地尝试过,但我更喜欢这种方式:

fun readFile(resourcePath: String) = String::class.java.getResource(resourcePath)?.readText() ?: "<handle default. or handle custom exception>"

甚至作为自定义数据类型函数

private fun String.asResource() = this::class.java.getResource(resourcePath)?.readText() ?: "<handle default. or handle custom exception>"

然后你可以直接在路径上调用:

// For suppose
val path = "/src/test/resources"
val content = path.asResource()