使用scala读取classpath下的属性文件

zjf*_*fdu 7 scala classpath

我试图使用scala从classpath读取属性文件.但它看起来不起作用,它与java不同.以下2个代码片段,一个是java(工作),另一个是scala(不工作).我不明白有什么区别.

// working
BufferedReader reader = new BufferedReader(new InputStreamReader(
Test.class.getResourceAsStream("conf/fp.properties")));

// not working 
val reader = new BufferedReader(new InputStreamReader(
getClass.getResourceAsStream("conf/fp.properties")));

Exception in thread "main" java.lang.NullPointerException
at java.io.Reader.<init>(Reader.java:78)
at java.io.InputStreamReader.<init>(InputStreamReader.java:72)
at com.ebay.searchscience.searchmetrics.fp.conf.FPConf$.main(FPConf.scala:31)
at com.ebay.searchscience.searchmetrics.fp.conf.FPConf.main(FPConf.scala)
Run Code Online (Sandbox Code Playgroud)

Rom*_*nko 8

这段代码最终对我有用:

import java.util.Properties
import scala.io.Source

// ... somewhere inside module.

var properties : Properties = null

val url = getClass.getResource("/my.properties")
if (url != null) {
    val source = Source.fromURL(url)

    properties = new Properties()
    properties.load(source.bufferedReader())
}
Run Code Online (Sandbox Code Playgroud)

现在你有了普通的旧java.util.Properties来处理我的遗留代码实际需要接收的内容.


sul*_*uls 6

我猜你BufferedReader是一个java.io.BufferedReader

在这种情况下,您可以简单地执行以下操作:

import scala.io.Source.fromUrl
val reader = fromURL(getClass.getResource("conf/fp.properties")).bufferedReader()
Run Code Online (Sandbox Code Playgroud)

但是,这样就可以解决您计划在reader事后做些什么的问题.scala.io.Source已经有一些有用的方法可能会使你的代码变得多余.. 请参阅ScalaDoc