Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用scala读取类路径下的属性文件_Scala_Classpath - Fatal编程技术网

使用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 =

我正在尝试使用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)
//正在工作
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()