7

我正在尝试使用 scala 从类路径中读取属性文件。但它看起来不起作用,它与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)
4

6 回答 6

9

这段代码终于为我工作了:

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 来处理我的遗留代码实际需要接收的内容。

于 2014-12-24T12:39:58.377 回答
8

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

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

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

但是,这留下了关于您打算如何处理reader之后的问题。scala.io.Source已经有一些有用的方法可能会让你的很多代码变得多余..参见 ScalaDoc

于 2013-02-27T12:05:07.167 回答
3

我首选的解决方案是使用com.typesafe.scala-logging。我确实在 main\resources 文件夹中放置了一个 application.conf 文件,内容如下:

services { mongo-db { retrieve = """http://xxxxxxxxxxxx""", base = """http://xxxxxx""" } }

并且要在类中使用它,首先从 typesafe 加载配置工厂,然后使用它。

val conf = com.typesafe.config.ConfigFactory.load() conf.getString("services.mongo-db.base"))

希望能帮助到你!

附言。我敢打赌,每个以 .conf 作为扩展名的资源文件都会被读取。

于 2015-06-22T14:05:01.337 回答
2

对于阅读我建议使用的属性文件java.util.ResourceBundle.getBundle("conf/fp"),它使生活变得更轻松。

于 2013-02-27T13:34:37.797 回答
0

您看到的 NullPointerException 是由底层 Java 代码中的错误引起的。这可能是由输入错误的文件名引起的。

有时,如果您尝试使用错误的类加载器加载资源,也会出现此错误。

  1. 根据您的类路径仔细检查资源 url。
  2. 尝试Source.fromInputStream(getClass.getResourceAsStream(...))
  3. 尝试Source.fromInputStream(getClass.getClassLoader.getResourceAsStream())
  4. 也许您正在使用其他可以尝试的类加载器?

同样的故事也发生在Source.fromUrl(...)

如果您尝试加载配置文件并控制它们的格式,则应该查看 Typesafe 的Config实用程序。

于 2013-06-03T09:57:15.167 回答
0

您得到的空指针异常来自 getResourceAsStream 返回空值。以下 junit.scala 片段显示了类与类加载器的区别。请参阅Class.getResource() 和 ClassLoader.getResource() 有什么区别?. 这里我假设fileName是驻留在类路径中的文件的名称,而不是运行测试的类旁边的文件。

assertTrue(getClass.getClassLoader().getResourceAsStream(fileName) != null)
assertTrue(getClass.getClassLoader().getResourceAsStream("/" + fileName) == null)
assertTrue(getClass.getResourceAsStream(fileName) == null)
assertTrue(getClass.getResourceAsStream("/" + fileName) != null)
于 2014-08-30T01:21:13.007 回答