কোটলিনে সংস্থান থেকে কোনও পাঠ্য ফাইল কীভাবে পড়বেন?


97

আমি কোটলিনে একটি স্পেক পরীক্ষা লিখতে চাই। পরীক্ষায় ফোল্ডারটি থেকে একটি এইচটিএমএল ফাইল পড়া উচিত src/test/resources। এটা কিভাবে করতে হবে?

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") {
                ...
            }
        }
    }
})

উত্তর:


116
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()
ফ্রাঙ্কো

20
val fileContent = javaClass.getResource("/html/file.html").readText()কাজটি আরও খাটো করে
তোলে

4
অদ্ভুতভাবে যথেষ্ট আমার সর্বদা একটি শীর্ষস্থানীয় স্ল্যাশ প্রয়োজন। উদাহরণস্বরূপ, ফাইলটি যদি রিসোর্স রুট ডিরেক্টরিতে থাকে তবে আপনাকে এখনও এটি "/file.html" হিসাবে উল্লেখ করতে হবে
সোমাইয়া কুম্বের

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উপরের উদাহরণে স্ট্রিং অবজেক্টকে বোঝায়।
jododges

এটি এক্সটেনশন ফাংশনটির ভয়ানক অপব্যবহার। ফাইল লোড করা স্ট্রিং ক্লাসের উদ্বেগ নয়।
বেন

এটা এই প্রসঙ্গে। আমি এটি বিশ্বব্যাপী উপলব্ধ করব না বা এটি পরীক্ষার ক্লাসের বাইরে ব্যবহার করব না। আমি এটিকে এখানে ম্যাপিংয়ের ফাংশনটি বেশি বিবেচনা করি।
ঝোডেজ

28

কেন এটি এত কঠিন তা জানেন না তবে আমি খুঁজে পেয়েছি সবচেয়ে সহজ উপায় (কোনও নির্দিষ্ট শ্রেণীর উল্লেখ না করে) হ'ল:

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

এবং তারপরে একটি নিখুঁত ইউআরএল পাস করা, যেমন

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

হয় {}প্রয়োজনীয়? শুধু কেন নয় javaClass.getResource(path).readText()?
অ্যান্ড্রুগাজেলকা

4
javaClass ডক্স অনুযায়ী একটি বস্তু আহ্বান করা আবশ্যক kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/java-class.html এটা ছাড়া তারপর আগে জীবনের জন্য যেতে :) কাজ করে
রাসেল ব্রিগস

4
উপরোক্ত পদ্ধতির একটি খারাপ দিক হ'ল এটি প্রতিটি সংস্থান অ্যাক্সেসের জন্য একটি নতুন অবজেক্ট তৈরি করে। ফাংশনের বাইরে ডামি অবজেক্টটি সঞ্চয় করা ভাল।
রাসেল ব্রিগস

@ রাসেলব্রিগস টিবিএইচ আমি এই বিষয়টিকে খুব বেশি গুরুত্ব দেয় বলে মনে করি না। আপনি যদি ডিস্ক অ্যাক্সেস করেন তবে কোনও অবজেক্ট তৈরির পারফরম্যান্স আসলেই কোনও সমস্যা নয়!
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") {
                ...
            }
        }
    }
})

কিছু কারণে এটি আমার পক্ষে কার্যকর হয়নি। ক্লাসে কাজ করার জন্য কেবল স্পষ্টভাবে কল করা। শুধু অন্যদের জন্য যোগ করা। আমি মনে করি এর টর্নেডোফেক্সের সাথে কিছু করার আছে
এনএমু

ইন টেস্ট ইনপুট ফাইল তৈরি করার পরে /src/test/resources, this.javaClass.getResource("/<test input filename>")প্রত্যাশার মতো কাজ করেছিল। উপরের সমাধানের জন্য ধন্যবাদ।
jkwuc89

ফাইল কন্টেন্ট যদি স্ট্রিং না হয় এবং আমি কোনও ডামি অবজেক্ট তৈরি না করি তবে কী করব?
মিনিজিবি

4
এখানে পাথ বাধ্যতামূলক বলে মনে হওয়ার আগে স্ল্যাশকে নেতৃত্ব দেওয়া, অন্যদিকে জাভাতে আমি সাধারণত এটি বাদ দিই।
কাকরাউব

6

কোটলিন + বসন্তের পথ:

@Autowired
private lateinit var resourceLoader: ResourceLoader

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



4

গুগল পেয়ারা গ্রন্থাগার রিসোর্স ক্লাস ব্যবহার করে :

import com.google.common.io.Resources;

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

এটি দুর্দান্ত যে গুয়াভ রিসোর্স না পাওয়া গেলে একটি ফাইলের নাম রিপোর্ট করে - সমস্যা সমাধানের জন্য আরও ভাল
নিশি

2

এইভাবেই আমি এটি করতে পছন্দ করি:

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

0

আপনি ফাইল শ্রেণিটি দরকারী খুঁজে পেতে পারেন:

import java.io.File

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

4
এই উত্তরটি বিভ্রান্তিকর। এটি কোনও "রিসোর্স" লোড করে না তবে ক্লাসপথের পরিবর্তে ফাইল সিস্টেম থেকে সরাসরি ফাইল লোড করে। অ্যাপ্লিকেশনটি একত্রিত হওয়ার পরে এটি আর কাজ করবে না কারণ আপনি জার ফাইল থেকে লোড করার পরিবর্তে অস্থানীয় ফাইলগুলিকে উল্লেখ করার চেষ্টা করবেন।
বেন

@ বেন আপনার মন্তব্যের জন্য ধন্যবাদ। কোটলিন স্পেক পরীক্ষায় রিসোর্স থেকে ফাইল পড়ার বিষয়ে প্রশ্ন ছিল।
ক্রিজিসটফ জিয়োমেক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.