Scala'da kaynaklar klasöründen dosyalar nasıl okunur?


112

Aşağıdaki gibi bir klasör yapısına sahibim:

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

ve bu klasörlerde okumam gereken dosyalarım var. İşte kod:

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

Sonrasında herhangi bir sorunuz varsa lütfen Andreas Neumann tarafından verilen cevap kabul edilmedi. -1.
Vishrant

Yanıtlar:


201

Scala'daki kaynaklar tam olarak Java'da olduğu gibi çalışır. Bu takip etmek en iyisidir Java iyi uygulamaları ve tüm kaynakları koymak src/main/resourcesve src/test/resources.

Örnek klasör yapısı:

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

Scala 2.12.x && 2.13.x bir kaynak okuyor

Kaynakları okumak için, nesne Kaynak , Kaynaktan yöntemi sağlar .

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

2.12'den önceki kaynakları okumak (jar uyumluluğu nedeniyle hala favorim)

Kaynakları okumak için getClass.getResource ve getClass.getResourceAsStream kullanabilirsiniz .

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

daha güzel hata geri bildirimi (2.12.x && 2.13.x)

Hata ayıklaması yapılamayan Java NPE'lerinden kaçınmak için şunları göz önünde bulundurun:

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

bunu bildiğim iyi oldu

Unutmayın getResourceAsStream kaynaklar parçası olduğunda da cezası çalışır kavanoz , getResource çoğu zaman problemlere yol açabilir bir dosya oluşturmak için kullanılan bir URL'yi döndürür.

üretimde

Üretim kodunda kaynağın tekrar kapatıldığından emin olmanızı öneririm.


GetResource kullanılırsa ve bir Dosyaya dönüştürülürse ne tür sorunlar ortaya çıkabilir? Bir bağlantı verebilir misiniz?
akauppi

2
Bazı durumlarda boş İşaretçi olarak: stackoverflow.com/questions/941754/…
Andreas Neumann

Bu kod muhtemelen getResourceAsStream için açık işleyici bırakıyor.
Sisso

3
closeKaynağı unutma
Guillaume Massé

1
Teşekkürler! Byt türleri Nicer hata geri bildirimi (2.12.x) bölümünde eşleşmiyor . Peki ya bellek sızıntıları? Kaynak kapatılmamalı mı?
Albert Bikeev

30

Scala> = 2.12 için şunu kullanın Source.fromResource:

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

13
Önemli: Source.fromResourcesizinle birlikte ilk eğik çizgiyi koymayın getResourceAsStream.
vossad01

6
Ve bunun 2.12+ olduğunu unutmayın
rbellamy

Peki ya 2.10 sürümleri?
Jaydev

12

Scala> = 2.12 için Onliner çözümü

val source_html = Source.fromResource("file.html").mkString

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

  }

}

görüntü açıklamasını buraya girin

DÜZENLEME: Orijinal yazara kredi. Blogun tamamına buradan bakın


Bir web sitesinden kopyaladığınızda, lütfen orijinal yazara bir bağlantı gönderin. Ödenmesi gereken yere kredi verin. Referans
ForeverLearner

2

İçin Scala 2.11 getLines tam olarak yapmazsa, size aynı zamanda yerel dosya sistemine kavanoz bir dosyayı kopyalayabilirsiniz istediğini.

İşte / kaynaklarından bir ikili google .p12 formatında API anahtarı okuyan bir snippit, öyle / tmp ve ardından bir girdi olarak dosya yolu dizesini kullanır yazar kıvılcım-google-elektronik tablolar yazma .

Sbt-native-packager ve sbt-assembly dünyasında, yerele kopyalama, ölçeklendirme ikili dosya testleri için de yararlıdır. Bunları yerel olarak kaynaklardan çıkarın, testleri çalıştırın ve ardından silin.

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

2

Gerekli dosyaya aşağıdaki gibi scala'daki kaynak klasöründen erişilebilir.

val file = scala.io.Source.fromFile(s"src/main/resources/app.config").getLines().mkString
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.