कोटलिन में संसाधनों से एक पाठ फ़ाइल कैसे पढ़ें?


94

मैं कोटलिन में एक स्पेक टेस्ट लिखना चाहता हूं। परीक्षण को 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") {
                ...
            }
        }
    }
})

जवाबों:


111
val fileContent = MySpec::class.java.getResource("/html/file.html").readText()

30
मेरे लिए यह काम नहीं किया, मुझे इसे बदलना पड़ाthis::class.java.classLoader.getResource("/html/file.html").readText()
pavlos163

4
मेरे लिए ये दोनों विकल्प एक एंड्रॉइड ऐप में काम करते हैं ( /उनमें से एक में अतिरिक्त नोटिस करें, जिसे दूसरे में निकालना है): this::class.java.getResource("/html/file.html").readText()औरthis::class.java.classLoader.getResource("html/file.html").‌​readText()
फ्रेंको

19
val fileContent = javaClass.getResource("/html/file.html").readText()काम भी कम करता है
फ्रैंक नेबेलंग

28

एक और थोड़ा अलग समाधान:

@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)
}

एक एक्सटेंशन फ़ंक्शन का अच्छा उपयोग! लेकिन आप यहाँ एक लंबो फ़ंक्शन का उपयोग क्यों करते हैं? इससे मुझे कोई मतलब नहीं है। इसके अलावा, thisभाग मेरे लिए काम नहीं किया। इस प्रकार मैं निम्नलिखित सलाह देता हूं:fun String.asResource(): URL? = object {}.javaClass.getResource(this)
Qw3ry

मुझे उस पर काम करने का यह तरीका पसंद है जहां आप फ़ाइल की घोषणा करते हैं, फिर उस फ़ाइल की सामग्री पर काम करते हैं। व्यक्तिगत पसंद मुझे लगता है। thisउपरोक्त उदाहरण में स्ट्रिंग ऑब्जेक्ट को संदर्भित करता है।
१२:२१ बजे

विस्तार समारोह का भयानक दुरुपयोग है। फ़ाइलें लोड करना स्ट्रिंग क्लास की चिंता नहीं है।
बेन

यह इस संदर्भ में है। मैं इसे विश्व स्तर पर उपलब्ध नहीं कराऊंगा या परीक्षण कक्षाओं के बाहर इसका उपयोग नहीं करूंगा। मैं इसे यहां मैपिंग फ़ंक्शन के बारे में अधिक मानता हूं।
फेज

25

पता नहीं क्यों यह इतना कठिन है, लेकिन सबसे सरल तरीका जो मैंने पाया है (एक विशेष वर्ग को संदर्भित किए बिना) है:

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

और फिर एक निरपेक्ष URL में गुजर रहा है, जैसे

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

की {}आवश्यकता है सिर्फ क्यों नहीं javaClass.getResource(path).readText()?
andrewgazelka

1
javaClass को डॉक्स kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/java-class.html के अनुसार किसी ऑब्जेक्ट पर कॉल किया जाना चाहिए। अगर यह बिना काम करता है तो फिर जीवन पर जाएं :)
रसेल ब्रिग्स

3
ऊपर की विधि के साथ एक नकारात्मक पहलू यह है कि यह प्रत्येक संसाधन के उपयोग के लिए एक नई वस्तु बनाता है। फंक्शन के बाहर डमी ऑब्जेक्ट को स्टोर करना बेहतर होगा।
रसेल ब्रिग्स

@RussellBriggs tbh मुझे नहीं लगता कि यह ज्यादा मायने रखता है। यदि आप डिस्क एक्सेस करते हैं तो ऑब्जेक्ट निर्माण का प्रदर्शन वास्तव में कोई समस्या नहीं है!
Qw3ry

13

थोड़ा अलग समाधान:

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

            var fileContent = ""

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

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

किसी कारण से यह मेरे लिए काम नहीं किया। केवल स्पष्ट रूप से बुलाए गए वर्ग ने काम किया। बस दूसरों के लिए जोड़ना। मुझे लगता है कि इसका टॉर्नडॉफ़ के साथ कुछ करना है
nmu

में एक परीक्षण इनपुट फ़ाइल बनाने के बाद /src/test/resources, this.javaClass.getResource("/<test input filename>")उम्मीद के मुताबिक काम किया। उपरोक्त समाधान के लिए धन्यवाद।
jkwuc89

क्या करना है, अगर फ़ाइलकंटेंट स्ट्रिंग नहीं है और मैं कोई डमी ऑब्जेक्ट नहीं बनाऊंगा?
minizibi

1
पथ से पहले अग्रणी स्लैश यहां अनिवार्य लगता है, जबकि जावा में मैं आमतौर पर इसे छोड़ देता हूं।
केकड़ावा


5

कोटलिन + स्प्रिंग तरीका:

@Autowired
private lateinit var resourceLoader: ResourceLoader

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


4

Google अमरूद पुस्तकालय संसाधन वर्ग का उपयोग करना :

import com.google.common.io.Resources;

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

यह अच्छा है कि गुवे ने एक फ़ाइल नाम की रिपोर्ट की अगर संसाधन नहीं मिला - समस्या निवारण के लिए बेहतर
निशि

0

आपको फ़ाइल वर्ग उपयोगी लग सकता है:

import java.io.File

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

3
यह उत्तर भ्रामक है। वह "संसाधन" लोड नहीं करता है, लेकिन क्लासपथ के बजाय फ़ाइल सिस्टम से फ़ाइल को सीधे लोड करता है। आवेदन जमा होने के बाद यह काम नहीं करेगा क्योंकि आप जार फाइल से लोड करने के बजाय, किसी भी फाइल को संदर्भित करने का प्रयास नहीं करेंगे।
बेन

@बेन आपकी टिप्पणी के लिए धन्यवाद। प्रश्न कोटल स्पेक टेस्ट में संसाधन से फाइल पढ़ने के बारे में था।
क्रिज़ीस्तोफ़ ज़ीओमेक

0

यह वह तरीका है जो मैं इसे करना पसंद करता हूं:

fun getResourceText(path: String): String {
    return File(ClassLoader.getSystemResource(path).file).readText()
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.