স্কালায় রিসোর্স ফোল্ডার থেকে ফাইলগুলি কীভাবে পড়বেন?


112

আমার নীচের মতো একটি ফোল্ডার কাঠামো রয়েছে:

- main
-- java
-- resources 
-- scalaresources
--- commandFiles 

এবং সেই ফোল্ডারে আমার ফাইলগুলি পড়তে হয়। কোডটি এখানে:

def readData(runtype: String, snmphost: String, comstring: String, specificType:  String): Unit = {
  val realOrInvFile = "/commandFiles/snmpcmds." +runtype.trim // these files are under commandFiles folder, which I have to read. 
    try {
      if (specificType.equalsIgnoreCase("Cisco")) {
        val specificDeviceFile: String = "/commandFiles/snmpcmds."+runtype.trim+ ".cisco"
        val realOrInvCmdsList = scala.io.Source.fromFile(realOrInvFile).getLines().toList.filterNot(line => line.startsWith("#")).map{
          //some code 
        }
        val specificCmdsList = scala.io.Source.fromFile(specificDeviceFile).getLines().toList.filterNot(line => line.startsWith("#")).map{
          //some code
        }
      }
    } catch {
      case e: Exception => e.printStackTrace
    }
  }
}

যদি আপনার কোনও ফলোআপ প্রশ্ন থাকে তবে এন্ড্রেয়াস নিউমানের দেওয়া উত্তর কেন গ্রহণ করা হয়নি? -1।
ভিশ্রান্ট

উত্তর:


201

স্কালার সংস্থানগুলি জাভাতে ঠিক তেমন কাজ করে। এটা অনুসরণ করা উত্তম জাভা সর্বোত্তম কার্যাভ্যাস এবং সমস্ত সম্পদ করা src/main/resourcesএবং src/test/resources

ফোল্ডারের কাঠামোর উদাহরণ:

testing_styles/
├── build.sbt
├── src
│   └── main
│       ├── resources
│       │   └── readme.txt

একটি উত্স পড়তে 2.12.x && 2.13.x স্কেল করুন

রিসোর্স পড়ার জন্য অবজেক্ট সোর্স রিসোর্স থেকে পদ্ধতি সরবরাহ করে

import scala.io.Source
val readmeText : Iterator[String] = Source.fromResource("readme.txt").getLines

২.১২ পূর্বের রিসোর্সগুলি পড়ুন (জারের সামঞ্জস্যের কারণে এখনও আমার প্রিয়)

সংস্থানগুলি পড়তে আপনি getClass.getResource এবং getClass.getResourceAsStream ব্যবহার করতে পারেন ।

val stream: InputStream = getClass.getResourceAsStream("/readme.txt")
val lines: Iterator[String] = scala.io.Source.fromInputStream( stream ).getLines

ভাল ত্রুটি প্রতিক্রিয়া (2.12.x && 2.13.x)

অব্যক্ত জাভা এনপিইগুলি এড়াতে, বিবেচনা করুন:

import scala.util.Try
import scala.io.Source
import java.io.FileNotFoundException

object Example {

  def readResourceWithNiceError(resourcePath: String): Try[Iterator[String]] = 
    Try(Source.fromResource(resourcePath).getLines)
      .recover(throw new FileNotFoundException(resourcePath))
 }

জানা ভাল

মনে রাখবেন যে রিসোর্সএস্ট্রাস্ট যখন সূত্রগুলি জারের অংশ হয় ঠিকঠাক কাজ করে , গেটআরসোর্স , যা একটি URL দেয় যা প্রায়শই একটি ফাইল তৈরির জন্য ব্যবহৃত হয় সেখানে সমস্যা দেখা দিতে পারে।

উৎপাদন

প্রোডাকশন কোডে আমি উত্সটি আবার বন্ধ হয়েছে কিনা তা নিশ্চিত করার পরামর্শ দিই।


GetResource ব্যবহার করে এবং এটিকে একটি ফাইলে রূপান্তর করা হলে কোন ধরণের সমস্যা দেখা দিতে পারে? তুমি কি একটি লিংক সরবরাহ করতে পার?
akauppi

2
কিছু পরিস্থিতিতে একটি নাল পয়েন্টার: স্ট্যাকওভারফ্লো.com প্রশ্নস ৯১৪75৫৪/২
আন্দ্রে নুমান

এই কোডটি সম্ভবত রিসোর্সএস্ট্রিমের জন্য মুক্ত হ্যান্ডলারটি ছেড়ে চলেছে।
সিসো

3
ভুলে যাবেন না closeউত্সটি
গিলাইম

1
ধন্যবাদ! বাইরের ধরণগুলি নিকারের ত্রুটি প্রতিক্রিয়া (2.12.x) বিভাগে মেলে না । এবং মেমরি ফাঁস সম্পর্কে কি? রিসোর্স বন্ধ করা উচিত নয়?
অ্যালবার্ট বাইকেভ

30

স্কালা> = 2.12 এর জন্য, ব্যবহার করুন Source.fromResource:

scala.io.Source.fromResource("located_in_resouces.any")

13
গুরুত্বপূর্ণ: আপনার সাথে Source.fromResourceআপনার সাথে থাকা প্রাথমিক ফরোয়ার্ড স্ল্যাশ রাখবেন না getResourceAsStream
vossad01

6
এবং দ্রষ্টব্য যে এটি 2.12+
0:32 এ rbellamy

২.১০ সংস্করণ সম্পর্কে কী বলা যায়?
জয়দেব

12

স্কালার জন্য অনলাইনার সমাধান> = 2.12

val source_html = Source.fromResource("file.html").mkString

4
import scala.io.Source

object Demo {

  def main(args: Array[String]): Unit = {

    val fileStream = getClass.getResourceAsStream("/json-sample.js")
    val lines = Source.fromInputStream(fileStream).getLines
    lines.foreach(line => println(line))

  }

}

এখানে চিত্র বর্ণনা লিখুন

সম্পাদনা: মূল লেখকের কাছে ক্রেডিট। এখানে সম্পূর্ণ ব্লগ উল্লেখ করুন


আপনি যখন কোনও ওয়েবসাইট থেকে অনুলিপি করেন, দয়া করে মূল লেখকের লিঙ্ক পোস্ট করুন। যেখানে creditণ আছে তা জমা দিন। পড়ুন: fruzenshtein.com/scala-working-with-resources-folders-files
ForeverLearner

2

জন্য Scala 2.11 , যদি getLines ঠিক করে না তুমি কি চাও আপনার কাছে স্থানীয় ফাইল সিস্টেমে বয়াম থেকে একটি ফাইল কপি করতে পারেন।

এখানে একটি স্নিপিট রয়েছে যা / উত্স থেকে বাইনারি গুগল .p12 ফর্ম্যাট API কী পড়বে, এটি / tmp এ লিখবে এবং তারপরে স্পার্ক-গুগল-স্প্রেডশিট লেখার ইনপুট হিসাবে ফাইল পাথ স্ট্রিংটি ব্যবহার করবে

জগতে SBT-দেশীয়-প্যাকেজ এবং SBT-সমাবেশ , স্থানীয় অনুলিপি এছাড়াও scalatest বাইনারি ফাইল পরীক্ষা দিয়ে দরকারী। এগুলিকে স্থানীয়ভাবে উত্স থেকে আউট করুন, পরীক্ষা চালান এবং তারপরে মুছুন।

import java.io.{File, FileOutputStream}
import java.nio.file.{Files, Paths}

def resourceToLocal(resourcePath: String) = {
  val outPath = "/tmp/" + resourcePath
  if (!Files.exists(Paths.get(outPath))) {
    val resourceFileStream = getClass.getResourceAsStream(s"/${resourcePath}")
    val fos = new FileOutputStream(outPath)
    fos.write(
      Stream.continually(resourceFileStream.read).takeWhile(-1 !=).map(_.toByte).toArray
    )
    fos.close()
  }
  outPath
}

val filePathFromResourcesDirectory = "google-docs-key.p12"
val serviceAccountId = "[something]@drive-integration-[something].iam.gserviceaccount.com"
val googleSheetId = "1nC8Y3a8cvtXhhrpZCNAsP4MBHRm5Uee4xX-rCW3CW_4"
val tabName = "Favorite Cities"

import spark.implicits
val df = Seq(("Brooklyn", "New York"), 
          ("New York City", "New York"), 
          ("San Francisco", "California")).
          toDF("City", "State")

df.write.
  format("com.github.potix2.spark.google.spreadsheets").
  option("serviceAccountId", serviceAccountId).
  option("credentialPath", resourceToLocal(filePathFromResourcesDirectory)).
  save(s"${googleSheetId}/${tabName}")

2

স্কালার রিসোর্স ফোল্ডার থেকে প্রয়োজনীয় ফাইলটি নীচে হিসাবে অ্যাক্সেস করা যায়

val file = scala.io.Source.fromFile(s"src/main/resources/app.config").getLines().mkString
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.