Mam strukturę folderów jak poniżej:
- main
-- java
-- resources
-- scalaresources
--- commandFiles
iw tych folderach mam swoje pliki, które muszę przeczytać. Oto 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
}
}
}
scala
scala-collections
Pradip Karad
źródło
źródło
Odpowiedzi:
Zasoby w Scali działają dokładnie tak samo, jak w Javie. Najlepiej postępować zgodnie z najlepszymi praktykami Java i umieszczać wszystkie zasoby w
src/main/resources
isrc/test/resources
.Przykładowa struktura folderów:
Scala 2.12.x && 2.13.x odczytuje zasób
Aby odczytać zasoby, obiekt Source udostępnia metodę fromResource .
czytanie zasobów przed 2.12 (nadal moje ulubione ze względu na zgodność z jarami)
Aby odczytać zasoby, możesz użyć getClass.getResource i getClass.getResourceAsStream .
ładniejsza informacja o błędach (2.12.x && 2.13.x)
Aby uniknąć niemożliwych do usunięcia błędów NPE Java, rozważ:
dobrze wiedzieć
Należy pamiętać, że getResourceAsStream działa również dobrze, gdy zasoby są częścią jar , getResource , który zwraca adres URL, który jest często używany do tworzenia pliku, może prowadzić do problemów.
w produkcji
W kodzie produkcyjnym proponuję upewnić się, że źródło jest ponownie zamknięte.
źródło
close
ŹródleDla Scala> = 2.12 użyj
Source.fromResource
:źródło
Source.fromResource
tobą nie umieszczaj początkowego ukośnika, który maszgetResourceAsStream
.Rozwiązanie onliner dla Scala> = 2.12
źródło
EDYCJA: Kredyt dla pierwotnego autora. Zapoznaj się z pełnym blogiem tutaj
źródło
Dla Scali 2.11 , jeśli getLines nie robi dokładnie tego, co chcesz, możesz również skopiować plik a z jar do lokalnego systemu plików.
Oto fragment, który odczytuje binarny klucz API w formacie google .p12 z / resources, zapisuje go w / tmp, a następnie używa ciągu ścieżki pliku jako danych wejściowych do zapisu w arkuszu kalkulacyjnym spark-google-spreadsheets .
W świecie sbt-native-packager i sbt-assembly , kopiowanie do lokalnego jest również przydatne przy testach plików binarnych o największej skali. Po prostu wyrzuć je z zasobów do lokalnego, uruchom testy, a następnie usuń.
źródło
Dostęp do wymaganego pliku można uzyskać jak poniżej z folderu zasobów w scali
źródło