mvc - ¿Cómo leer archivos de la carpeta de recursos en Scala?
spring framework pdf español (6)
Tengo una estructura de carpetas como la siguiente:
- main
-- java
-- resources
-- scalaresources
--- commandFiles
y en esas carpetas tengo mis archivos que tengo que leer. Aquí está el 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
}
}
}
Solución Onliner para Scala> = 2.12
val source_html = Source.fromResource("file.html").getLines().mkString("/n")
Los recursos en Scala funcionan exactamente igual que en Java.
Es mejor seguir las
mejores prácticas de Java
y poner todos los recursos en
src/main/resources
y
src/test/resources
.
Ejemplo de estructura de carpetas:
testing_styles/
├── build.sbt
├── src
│ └── main
│ ├── resources
│ │ └── readme.txt
Scala 2.12.x && 2.13.x leyendo un recurso
Para leer recursos, el objeto Source proporciona el método fromResource .
import scala.io.Source
val readmeText : Iterator[String] = Source.fromResource("readme.txt").getLines
leer recursos anteriores a 2.12 (sigue siendo mi favorito debido a la compatibilidad con jar)
Para leer recursos, puede usar getClass.getResource y getClass.getResourceAsStream .
val stream: InputStream = getClass.getResourceAsStream("/readme.txt")
val lines: Iterator[String] = scala.io.Source.fromInputStream( stream ).getLines
Comentarios de error más agradables (2.12.x && 2.13.x)
Para evitar los NPE de Java que no se pueden eliminar, considere:
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))
}
bueno saber
Tenga en cuenta que getResourceAsStream también funciona bien cuando los recursos son parte de un jar , getResource , que devuelve una URL que a menudo se usa para crear un archivo puede causar problemas allí.
en producción
En el código de producción, sugiero asegurarme de que la fuente se cierre nuevamente.
Para Scala 2.11 , si getLines no hace exactamente lo que desea, también puede copiar un archivo del jar al sistema de archivos local.
Aquí hay un fragmento que lee una clave API binaria de formato google .p12 de / resources, la escribe en / tmp y luego usa la cadena de ruta del archivo como entrada para una write spark-google-spreadsheets .
En el mundo de sbt-native-packager sbt-assembly y sbt-assembly , copiar a local también es útil con las pruebas de archivos binarios más escalas. Simplemente sáquelos de los recursos locales, ejecute las pruebas y luego elimínelos.
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}")
Para Scala> = 2.12, use
Source.fromResource
:
scala.io.Source.fromResource("located_in_resouces.any")
Se puede acceder al archivo requerido como se muestra a continuación desde la carpeta de recursos en scala
archivo val = scala.io.Source.fromFile (s "src / main / resources / app.config"). getLines (). mkString
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))
}
}
EDITAR: Crédito al autor original. Consulte el blog completo here