7

scala を使用してクラスパスからプロパティ ファイルを読み込もうとしています。しかし、それはうまくいかないようです、それはJavaとは異なります。次の 2 つのコード スニペット。1 つは Java (動作中)、もう 1 つは 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

私はあなたBufferedReaderjava.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です。次のような内容の application.conf ファイルを main\resources フォルダーに配置しました。

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

クラスで使用するには、最初にタイプセーフから設定ファクトリをロードしてから使用します。

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

それが役に立てば幸い!

Ps。拡張子が .conf のリソース上のすべてのファイルが読み取られることは間違いありません。

于 2015-06-22T14:05:01.337 に答える
2

私が使用することをお勧めするプロパティファイルを読むためjava.util.ResourceBundle.getBundle("conf/fp")に、それは人生を少し楽にします。

于 2013-02-27T13:34:37.797 に答える
0

取得している Null Pointer Exception は、null を返す 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 に答える