Eu tenho uma estrutura de pastas como a abaixo:
- main
-- java
-- resources
-- scalaresources
--- commandFiles
e nessas pastas tenho meus arquivos que devo ler. Aqui está o código:
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
fonte
fonte
Respostas:
Os recursos em Scala funcionam exatamente como em Java. É melhor seguir as melhores práticas de Java e colocar todos os recursos em
src/main/resources
esrc/test/resources
.Exemplo de estrutura de pasta:
Scala 2.12.x && 2.13.x lendo um recurso
Para ler recursos, o objeto Source fornece o método fromResource .
ler recursos anteriores ao 2.12 (ainda meu favorito devido à compatibilidade do jar)
Para ler recursos, você pode usar getClass.getResource e getClass.getResourceAsStream .
feedback de erro mais agradável (2.12.x && 2.13.x)
Para evitar NPEs Java que não podem ser compilados, considere:
bom saber
Lembre-se de que getResourceAsStream também funciona bem quando os recursos fazem parte de um jar , getResource , que retorna uma URL que costuma ser usada para criar um arquivo pode causar problemas nesse local.
em produção
No código de produção, sugiro certificar-se de que o código-fonte seja fechado novamente.
fonte
close
da FontePara Scala> = 2,12, use
Source.fromResource
:fonte
Source.fromResource
você, não coloque a barra inicial que você tem comgetResourceAsStream
.Solução Onliner para Scala> = 2,12
fonte
EDIT: Crédito ao autor original. Consulte o blog completo aqui
fonte
Para Scala 2.11 , se getLines não fizer exatamente o que você deseja, você também pode copiar o arquivo do jar para o sistema de arquivos local.
Este é um snippit que lê uma chave binária de API de formato google .p12 de / resources, grava em / tmp e usa a string de caminho de arquivo como uma entrada para uma gravação de spark-google-spreadsheets .
No mundo do sbt-native-packager e sbt-assembly , copiar para o local também é útil com os testes de arquivo binário escalatest. Basta retirá-los dos recursos para o local, executar os testes e excluí-los.
fonte
O arquivo necessário pode ser acessado como abaixo da pasta de recursos no scala
fonte