使用scala读取类路径下的属性文件
我正在尝试使用scala从类路径读取属性文件。但它看起来不起作用,它与java不同。下面的2个代码段,一个是java(工作),另一个是scala(不工作)。我不明白有什么区别使用scala读取类路径下的属性文件,scala,classpath,Scala,Classpath,我正在尝试使用scala从类路径读取属性文件。但它看起来不起作用,它与java不同。下面的2个代码段,一个是java(工作),另一个是scala(不工作)。我不明白有什么区别 // working BufferedReader reader = new BufferedReader(new InputStreamReader( Test.class.getResourceAsStream("conf/fp.properties"))); // not working val reader =
// 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)
//正在工作
BufferedReader reader=新的BufferedReader(新的InputStreamReader(
Test.class.getResourceAsStream(“conf/fp.properties”);
//不起作用
val reader=新的BufferedReader(新的InputStreamReader(
getClass.getResourceAsStream(“conf/fp.properties”);
线程“main”java.lang.NullPointerException中出现异常
在java.io.Reader上。(Reader.java:78)
位于java.io.InputStreamReader。(InputStreamReader.java:72)
在com.ebay.searchscience.searchmetrics.fp.conf.FPConf$.main(FPConf.scala:31)上
在com.ebay.searchscience.searchmetrics.fp.conf.FPConf.main(FPConf.scala)上
我猜您的BufferedReader
是java.io.BufferedReader
在这种情况下,您可以简单地执行以下操作:
import scala.io.Source.fromUrl
val reader = fromURL(getClass.getResource("conf/fp.properties")).bufferedReader()
但是,这就留下了一个问题,即您计划在以后如何使用
读取器scala.io.Source
已经有了一些有用的方法,这些方法可能会使许多代码变得多余 对于读取属性文件,我建议使用java.util.ResourceBundle.getBundle(“conf/fp”)
,这会让您的工作更轻松。您看到的NullPointerException是由底层java代码中的错误引起的。这可能是由于键入错误的文件名造成的
如果试图用错误的类加载器加载资源,有时也会出现此错误
对照类路径仔细检查资源url
请尝试Source.fromInputStream(getClass.getResourceAsStream(…)
请尝试Source.fromInputStream(getClass.getClassLoader.getResourceAsStream())
也许您正在使用其他类加载器,您可以尝试吗
Source.fromUrl(…)
如果您试图加载配置文件并控制其格式,则应查看Typesafe的实用程序。您得到的空指针异常来自getResourceAsStream,返回Null。下面的junit.scala代码片段显示了类与类加载器之间的区别。看见这里我假设fileName
是驻留在类路径中的文件名,但不是运行测试的类旁边的文件名
assertTrue(getClass.getClassLoader().getResourceAsStream(fileName) != null)
assertTrue(getClass.getClassLoader().getResourceAsStream("/" + fileName) == null)
assertTrue(getClass.getResourceAsStream(fileName) == null)
assertTrue(getClass.getResourceAsStream("/" + fileName) != null)
这段代码终于对我起作用了:
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())
}
现在您有了普通的java.util.Properties来处理我的遗留代码实际需要接收的内容。我首选的解决方案是使用。我确实在main\resources文件夹中放了一个application.conf文件,内容如下:
服务{
蒙戈数据库{
检索“”http://xxxxxxxxxxxx""",
base=“”http://xxxxxx"""
}
}
要在类中使用它,首先从typesafe加载配置工厂,然后使用它
val conf=com.typesafe.config.ConfigFactory.load()
conf.getString(“services.mongo db.base”))
希望有帮助
另外,我打赌扩展名为.conf的资源上的每个文件都会被读取。如果属性文件驻留在jar文件中(例如,在资源目录中)?:val source=source.fromURL(getClass.getResource(“/conf/fp.properties”)
这是更好的方法谢谢,但它仍然不起作用,同样的例外。我不知道为什么它在这里找不到文件。为什么不使用?得到了解决方案,我应该在这里使用绝对路径“/conf/fp.properties”,但仍然不清楚为什么在**“此方法返回后指定的流保持打开状态”。**中的相对路径在java中有效,而在scalaas中无效。因此,您需要为其分配一个tmp var,然后需要调用close,这样文件描述符就不会泄漏:val reader=source.bufferedReader()
properties.load(reader)
reader.close()