it-swarm.com.de

Wie lese ich Dateien aus dem Ressourcenordner in Scala?

Ich habe eine Ordnerstruktur wie folgt:

- main
-- Java
-- resources 
-- scalaresources
--- commandFiles 

und in diesen Ordnern habe ich meine Dateien, die ich lesen muss. Hier ist der Code:

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
    }
  }
}
95
Pradip Karad

Ressourcen in Scala funktionieren genauso wie in Java. Befolgen Sie am besten die Best Practices für Java und platzieren Sie alle Ressourcen in src/main/resources und src/test/resources.

Beispiel für eine Ordnerstruktur:

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

Scala 2.12.x && 2.13.x Lesen einer Ressource

Um Ressourcen zu lesen, liefert das Objekt Source die Methode fromResource.

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

ressourcen vor 2.12 lesen (immer noch mein Favorit wegen der Kompatibilität mit jar)

Zum Lesen von Ressourcen können Sie getClass.getResource und getClass.getResourceAsStream verwenden.

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

schöneres Fehlerfeedback (2.12.x && 2.13.x)

Beachten Sie Folgendes, um undebuggbare Java NPEs zu vermeiden:

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

gut zu wissen

Beachten Sie, dass getResourceAsStream auch funktioniert, wenn die Ressourcen Teil eines jar, getResource sind, das eine URL zurückgibt, die häufig zum Erstellen verwendet wird Eine Datei kann dort zu Problemen führen.

in Produktion

Im Produktionscode schlage ich vor, sicherzustellen, dass die Quelle wieder geschlossen wird.

175
Andreas Neumann

Verwenden Sie für Scala> = 2.12 Source.fromResource:

scala.io.Source.fromResource("located_in_resouces.any")
27
Mohsen Kashi

Onliner-Lösung für Scala> = 2.12

val source_html = Source.fromResource("file.html").getLines().mkString("\n")
6
freedev
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))

  }

}

enter image description here

BEARBEITEN: Gutschrift an den ursprünglichen Autor. Lesen Sie den vollständigen Blog hier

3
Sri

Zum Scala 2.11Wenn getLines nicht genau das tut, was Sie wollen, können Sie auch die a-Datei aus dem jar in das lokale Dateisystem kopieren.

Hier ist ein Snippit, der einen binären API-Schlüssel im Google .p12-Format aus/resources liest, in/tmp schreibt und dann den Dateipfad als Eingabe für eine spark-google-spreadsheetsschreiben .

In der Welt von sbt-native-packager und sbt-assembly Das Kopieren nach local ist auch bei Tests mit skalierten Binärdateien hilfreich. Ziehen Sie sie einfach aus den lokalen Ressourcen heraus, führen Sie die Tests aus und löschen Sie sie.

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
Tony Fraser

Auf die erforderliche Datei kann wie folgt aus dem Ressourcenordner in Scala zugegriffen werden

val file = scala.io.Source.fromFile (s "src/main/resources/app.config"). getLines (). mkString

0
dominicrd