J'ai une structure de dossiers comme ci-dessous:
- main
-- java
-- resources
-- scalaresources
--- commandFiles
et dans ces dossiers, j'ai mes fichiers que je dois lire. Voici le 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
}
}
}
scala
scala-collections
Pradip Karad
la source
la source
Réponses:
Les ressources de Scala fonctionnent exactement comme elles le font en Java. Il est préférable de suivre les meilleures pratiques Java et de mettre toutes les ressources dans
src/main/resources
etsrc/test/resources
.Exemple de structure de dossier:
Scala 2.12.x && 2.13.x lecture d'une ressource
Pour lire les ressources, l'objet Source fournit la méthode fromResource .
lecture des ressources antérieures à 2.12 (toujours mon préféré en raison de la compatibilité des jar)
Pour lire les ressources, vous pouvez utiliser getClass.getResource et getClass.getResourceAsStream .
meilleur retour d'erreur (2.12.x && 2.13.x)
Pour éviter les NPE Java non déboguables, pensez à:
bon à savoir
Gardez à l'esprit que getResourceAsStream fonctionne également correctement lorsque les ressources font partie d'un fichier jar , getResource , qui renvoie une URL souvent utilisée pour créer un fichier peut entraîner des problèmes.
en production
Dans le code de production, je suggère de m'assurer que la source est à nouveau fermée.
la source
close
la sourcePour Scala> = 2.12, utilisez
Source.fromResource
:la source
Source.fromResource
vous ne mettez pas la barre oblique initiale que vous avez avecgetResourceAsStream
.Solution Onliner pour Scala> = 2.12
la source
EDIT: Crédit à l'auteur original. Reportez-vous au blog complet ici
la source
Pour Scala 2.11 , si getLines ne fait pas exactement ce que vous voulez, vous pouvez également copier le fichier a du jar vers le système de fichiers local.
Voici un extrait de code qui lit une clé d'API au format binaire google .p12 à partir de / resources, l'écrit dans / tmp, puis utilise la chaîne de chemin de fichier comme entrée pour une écriture de spark-google-spreadsheets .
Dans le monde de sbt-native-packager et sbt-assembly , la copie en local est également utile avec les tests de fichiers binaires scalatest. Faites-les simplement sortir des ressources en local, exécutez les tests, puis supprimez-les.
la source
Le fichier requis est accessible comme ci-dessous à partir du dossier de ressources dans scala
la source