2014-12-08 21 views
61

Ho una struttura di cartelle come di seguito:Come leggere i file dalla cartella delle risorse in Scala?

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

e che le cartelle ho i miei file che devo leggere. ecco il codice:

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

risposta

115

risorse a Scala funzionano esattamente come fanno in Java. È consigliabile seguire le best practice Java e inserire tutte le risorse in src/main/resources e src/test/resources.

Esempio struttura di cartelle:

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

Scala 2.12.x

Per leggere l'oggetto risorse Fonte fornisce il metodo fromResource.

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

precedenti versioni

Per leggere le risorse è possibile utilizzare getClass.getResource e getClass.getResourceAsStream.

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

Tenete a mente che getResourceAsStream funziona anche bene quando le risorse sono parte di una vaso, getResource, che restituisce un URL che viene spesso utilizzato per creare un file può portare a problemi lì.

Più bello di feedback di errore (2.12.x)

Per evitare undebuggable Java NPE (Java è così orribile), considerare:

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

Per ottenere risultati significativi FNFEs invece.

Per il codice di produzione vorrei anche suggerire di assicurarsi che la sorgente sia di nuovo chiusa.

+0

Che tipo di problemi potrebbero verificarsi se si utilizza getResource e trasformandolo in un file? Puoi fornire un collegamento? – akauppi

+2

In alcune circostanze un puntatore nullo: http://stackoverflow.com/questions/941754/how-to-get-a-path-to-a-resource-in-a-java-jar-file –

+0

Questo codice è probabilmente lasciando il gestore aperto per getResourceAsStream. – Sisso

13

Per Scala> = 2.12, utilizzare Source.fromResource:

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

Importante: con 'Source.fromResource' non si inserisce la barra iniziale che si ha con' getResourceAsStream'. – vossad01

+5

E nota che questo è 2.12+ – rbellamy

Problemi correlati