स्काला में रिसोर्स फोल्डर की फाइलों को कैसे पढ़ें?


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 संसाधन पढ़ना

संसाधनों को पढ़ने के लिए ऑब्जेक्ट स्रोत Resource से विधि प्रदान करता है ।

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

2.12 से पहले संसाधन पढ़ना (अभी भी जार संगतता के कारण मेरा पसंदीदा)

संसाधनों को पढ़ने के लिए आप 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))
 }

जानकार अच्छा लगा

ध्यान रखें कि getResourceAsStream भी ठीक काम करता है जब संसाधन जार का हिस्सा होते हैं , getResource , जो एक URL देता है जो अक्सर एक फ़ाइल बनाने के लिए उपयोग किया जाता है जिससे वहां समस्याएं पैदा हो सकती हैं।

उत्पादन में

उत्पादन कोड में मैं यह सुनिश्चित करने का सुझाव देता हूं कि स्रोत फिर से बंद हो गया है।


यदि getResource का उपयोग करके और इसे किसी फ़ाइल में बदल दिया जाए तो किस प्रकार की समस्याएं हो सकती हैं? क्या आप लिंक प्रदान कर सकते हैं?
एकुप्पि

2
कुछ परिस्थितियों में एक अशक्त सूचक: stackoverflow.com/questions/941754/…
एंड्रियास न्यूमन

यह कोड संभवतः getResourceAsStream के लिए खुला हैंडलर छोड़ रहा है।
सीसो

3
closeस्रोत के लिए मत भूलना
Guillaume Massé

1
धन्यवाद! बाइट प्रकार Nicer त्रुटि प्रतिक्रिया (2.12.x) अनुभाग में मेल नहीं खाते । और मेमोरी लीक के बारे में क्या? संसाधन बंद नहीं होना चाहिए?
अल्बर्ट बाइकेव

30

स्काला के लिए = = 2.12, उपयोग करें Source.fromResource:

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

13
महत्वपूर्ण: आपके साथ Source.fromResourceआपके पास प्रारंभिक फ़ॉरवर्ड स्लैश नहीं है जो आपके पास है getResourceAsStream
vossad01

6
और ध्यान दें कि यह 2.12+ है
rbellamy

2.10 संस्करण के बारे में क्या?
जयदेव

12

Scala> = 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))

  }

}

यहां छवि विवरण दर्ज करें

संपादित करें: मूल लेखक को श्रेय। पूरा ब्लॉग यहाँ देखें


जब आप किसी वेबसाइट से कॉपी करते हैं, तो कृपया मूल लेखक के लिए एक लिंक पोस्ट करें। जहां देय है, उसे श्रेय दें। संदर्भ: fruzenshtein.com/scala-working-with-resources-folders-files
ForeverLearner

2

के लिए स्काला 2.11 , अगर getLines वास्तव में ऐसा नहीं करता है कि आप क्या चाहते हैं आप भी स्थानीय फाइल सिस्टम के लिए जार के बाहर एक फाइल कॉपी कर सकते हैं।

यहाँ एक स्निपिट है जो / संसाधनों से एक बाइनरी google .p12 प्रारूप API कुंजी पढ़ता है, इसे / tmp पर लिखता है, और फिर स्पार्क-गूगल-स्प्रेडशीट लिखने के इनपुट के रूप में फ़ाइल पथ स्ट्रिंग का उपयोग करता है ।

Sbt-native-packager और sbt- असेंबली की दुनिया में , स्केलेस्ट बाइनरी टेस्ट टेस्ट के साथ लोकल पर कॉपी करना भी उपयोगी है। बस उन्हें स्थानीय से संसाधनों से बाहर निकालें, परीक्षण चलाएं और फिर हटाएं।

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.