我有一个文件夹结构如下:
- 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
}
}
}
7条答案
按热度按时间7fyelxc51#
Scala中的资源与Java中的资源工作方式完全相同,最好遵循 *Java最佳实践 *,将所有资源放在
src/main/resources
和src/test/resources
中。文件夹结构示例:
Scala 2.12.x和2.13.x阅读资源
要读取资源,对象Source提供方法fromResource。
阅读2.12之前的资源(由于jar兼容性,我仍然喜欢)
要读取资源,可以使用getClass.getResource和getClass.getResourceAsStream。
更好的错误反馈(2.12.x和2.13.x)
要避免不可调试的Java NPE,请考虑:
很高兴知道
请记住,当资源是jar的一部分时,getResourceAsStream也可以正常工作,getResource返回的URL通常用于创建文件,但可能会导致出现问题。
生产中##
在生产代码中,我建议确保再次关闭源代码。
k5ifujac2#
对于Scala〉= 2.12,使用
Source.fromResource
:sdnqo3pr3#
Scala的一行程序解决方案〉= 2.12
重要摘自评论(感谢@anentropic):对于Source.fromResource,您不需要在开头加上正斜杠。
iibxawm44#
at0kjp5o5#
所需的文件可以从scala的resource文件夹中访问,如下所示
qnzebej06#
对于Scala 2.11,如果getLines没有完全按照您的要求执行,您还可以将文件从jar复制到本地文件系统。
下面是一个代码片段,它从/resources读取二进制的google.p12格式API密钥,将其写入/tmp,然后使用文件路径字符串作为spark-google-spreadsheets写入的输入。
在sbt-native-packager和sbt-assembly的世界里,复制到本地对于scalatest二进制文件测试也很有用,只要将它们从资源中取出到本地,运行测试,然后删除即可。
ozxc1zmp7#
“resources”文件夹必须在源代码根目录下。如果使用intellj,请检查左侧项目文件夹中的蓝色文件夹。例如AppName/src/main/scala或Project/scala/../main/etc。
如果使用
val stream: InputStream = getClass.getResourceAsStream("/readme.txt")
,不要忘记“/”(正斜杠),给定readme.txt是资源中的文件