2014-12-08 12 views
61

Ich habe eine Ordnerstruktur wie folgt:Wie liest man Dateien aus dem Ressourcenordner in Scala?

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

und in diesem Ordner Ich habe meine Dateien, die ich zu lesen. 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 
    } 
    } 
} 

Antwort

115

Ressourcen in Scala genau arbeiten, wie sie in Java zu tun. Am besten folgen Sie den Java Best Practices und legen Sie alle Ressourcen in src/main/resources und src/test/resources.

Beispiel Ordnerstruktur:

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

Scala 2.12.x

Um Ressourcen das Objekt Quelle bietet die Methode Fromresource zu lesen.

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

früheren Versionen

Ressourcen lesen Sie getClass.getResource und getClass.getResourceAsStream verwenden können.

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

Beachten Sie, dass getResourceAsStream auch gut funktioniert, wenn die Ressourcen Teil eines jar sind, getResource, die eine URL zurück, die oft eine Datei erstellen verwendet wird, kann es zu Problemen führen.

Nicer Fehler Feedback (2.12.x)

Um zu vermeiden, undebuggable Java NPE (Java ist so schrecklich), betrachten:

import scala.io.Source 
import scala.util.Try 

def niceFeedbackReadResource(resource: String): List[String] = 
    Try(Source.fromResource(resource).getLines.toList) 
    .recover(throw new FileNotFoundException(resource)) 

Um stattdessen sinnvolle FNFEs zu bekommen.

Für Produktion Code würde ich auch vorschlagen, um sicherzustellen, dass die Quelle wieder geschlossen ist.

+0

Welche Probleme auftreten könnten, wenn getResource verwenden und sie in eine Datei zu verwandeln? Können Sie einen Link bereitstellen? – akauppi

+2

In einigen Fällen als Null Zeiger: http://stackoverflow.com/questions/941754/how-to-get-a-path-to-a-resource-in-a-java-jar-file –

+0

Dieser Code ist wahrscheinlich Offener Handler für getResourceAsStream lassen. – Sisso

13

Für Scala> = 2.12, verwenden Source.fromResource:

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

Wichtig: mit 'Source.fromResource' setzen Sie nicht den ersten Schrägstrich, den Sie mit' getResourceAsStream' haben. – vossad01

+5

Und beachten Sie, dass dies 2,12+ ist – rbellamy

Verwandte Themen