私は次のようなフォルダ構造を持っています:
- 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
}
}
}
Scalaのリソースは、Javaの場合とまったく同じように機能します。 Javaのベストプラクティスに従い、すべてのリソースをsrc/main/resources
およびsrc/test/resources
に配置するのが最善です。
フォルダー構造の例:
testing_styles/
├── build.sbt
├── src
│ └── main
│ ├── resources
│ │ └── readme.txt
リソースを読み取るために、オブジェクトSourceはメソッドfromResourceを提供します。
import scala.io.Source
val readmeText : Iterator[String] = Source.fromResource("readme.txt").getLines
リソースを読み取るには、getClass.getResourceおよびgetClass.getResourceAsStreamを使用できます。
val stream: InputStream = getClass.getResourceAsStream("/readme.txt")
val lines: Iterator[String] = scala.io.Source.fromInputStream( stream ).getLines
紛れもない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を返しますファイルはそこで問題を引き起こす可能性があります。
本番コードでは、ソースが再び閉じられることを確認することをお勧めします。
Scala> = 2.12の場合は、Source.fromResource
を使用します。
scala.io.Source.fromResource("located_in_resouces.any")
val source_html = Source.fromResource("file.html").getLines().mkString("\n")
にとって Scala 2.11、getLinesが希望どおりに動作しない場合は、jarからローカルファイルシステムにファイルをコピーすることもできます。
以下は、/ resourcesからバイナリのGoogle .p12形式のAPIキーを読み取り、/ tmpに書き込み、 spark-google-spreadsheetswrite 。
sbt-native-packager および sbt-Assembly の世界では、ローカルへのコピーは、scalatestのバイナリファイルテストでも役立ちます。リソースからローカルにポップし、テストを実行してから削除するだけです。
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}")
必要なファイルには、scalaのリソースフォルダーから以下のようにアクセスできます。
val file = scala.io.Source.fromFile(s "src/main/resources/app.config")。getLines()。mkString