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
}
}
}
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
Um Ressourcen zu lesen, liefert das Objekt Source die Methode fromResource.
import scala.io.Source
val readmeText : Iterator[String] = Source.fromResource("readme.txt").getLines
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
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))
}
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.
Im Produktionscode schlage ich vor, sicherzustellen, dass die Quelle wieder geschlossen wird.
Verwenden Sie für Scala> = 2.12 Source.fromResource
:
scala.io.Source.fromResource("located_in_resouces.any")
val source_html = Source.fromResource("file.html").getLines().mkString("\n")
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))
}
}
BEARBEITEN: Gutschrift an den ursprünglichen Autor. Lesen Sie den vollständigen Blog hier
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}")
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