Как читать файлы из папки ресурсов в Scala?
У меня есть структура папок, как показано ниже:
- main
-- java
-- resources
-- scalaresources
--- commandFiles
и в этих папках у меня есть мои файлы, которые я должен прочитать.
Вот код:
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
}
}
}
Ответы
Ответ 1
Ресурсы в Scala работают точно так же, как и в Java. Лучше всего следовать рекомендациям Java и размещать все ресурсы в src/main/resources
и src/test/resources
.
Пример структуры папок:
testing_styles/
├── build.sbt
├── src
│ └── main
│ ├── resources
│ │ └── readme.txt
Scala 2.12.x && 2.13.x чтение ресурса
Для чтения ресурсов объект Source предоставляет метод fromResource.
import scala.io.Source
val readmeText : Iterator[String] = Source.fromResource("readme.txt").getLines
ресурсы для чтения до 2.12 (все еще мой любимый из-за совместимости jar)
Для чтения ресурсов вы можете использовать getClass.getResource и getClass.getResourceAsStream.
val stream: InputStream = getClass.getResourceAsStream("/readme.txt")
val lines: Iterator[String] = scala.io.Source.fromInputStream( stream ).getLines
более приятная обратная связь (2.12.x && 2.13.x)
Чтобы избежать неснижаемых Java NPE, рассмотрите:
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))
}
хорошо знать
Имейте в виду, что getResourceAsStream также прекрасно работает, когда ресурсы являются частью jar, getResource, который возвращает URL-адрес, который часто используется для создания файла, может привести к проблемам там.
в производстве
В рабочем коде я предлагаю убедиться, что источник снова закрыт.
Ответ 2
Для Scala >= 2.12 используйте Source.fromResource
:
scala.io.Source.fromResource("located_in_resouces.any")
Ответ 3
Онлайн решение для Scala> = 2.12
val source_html = Source.fromResource("file.html").getLines().mkString("\n")
Ответ 4
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))
}
}
![enter image description here]()
РЕДАКТИРОВАТЬ: кредит первоначальному автору. Смотрите полный блог здесь
Ответ 5
Для Scala 2.11, если getLines не выполняет то, что вам нужно, вы также можете скопировать файл из jar в локальную файловую систему.
Здесь Snippit, который считывает двоичную Google P12 - формат ключ API из/ресурсов, записывает его в /TMP, а затем использует путь строку файла в качестве входных данных для свеч Google-таблиц писать.
В мире sbt-native- packager и sbt-assembly копирование в локальную систему также полезно при самых масштабных тестах двоичных файлов. Просто извлеките их из локальных ресурсов, запустите тесты, а затем удалите.
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}")
Ответ 6
К требуемому файлу можно получить доступ, как показано ниже, из папки ресурсов в Scala
.val file = scala.io.Source.fromFile(s "src/main/resources/app.config"). getLines(). mkString