2016-10-27 37 views
0

我試圖從.yaml文件中加載數據,其中我保留了兩臺機器的IP地址和端口。我.yaml文件如下:Java:解析.yaml文件[如果可能,使用snake.yaml]

config.yaml

ip_addresses : 
firstMachineAddress : '162.242.195.82' 
secondMachineAddress : '50.31.209.229' 
ports : 
firstTargetPort : '4041' 
secondTargetPort : '5051' 

而且我把這個項目文件夾下(不是在同一個包與類),在這裏我想從加載。但是,無論我迄今爲止嘗試過的都行不通。

最後,我把配置文件src/main/resources下,並試圖此:

private void loadFromFile() throws FileNotFoundException { 
     Yaml yaml = new Yaml(); 
     ArrayList<String> key = new ArrayList<String>(); 
     ArrayList<String> value = new ArrayList<String>(); 

     try { 
      InputStream ios = getClass().getResourceAsStream("/config.yaml"); 

      // Parse the YAML file and return the output as a series of Maps and Lists 
      Map<String, Object> result = (Map<String, Object>) yaml.load(ios); 
      for (Object name : result.keySet()) { 

       key.add(name.toString()); 
       value.add(result.get(name).toString()); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     System.out.println(key + " : " + value); 
    } 

但是這也沒有工作。我得到「流關閉」錯誤,它不會加載任何東西。

任何人都知道誰來解決這個問題?

P.S .:我被告知使用蛇 - yaml庫,我不能下載任何其他的,以防萬一。

回答

1

這很可能是因爲沒有找到文件config.yaml。爲了驗證,你應該嘗試從InputStream ios打印數據。您也可以撥打

URL url = getClass().getResource('/config.yaml'); 

並打印該URL以查看Java返回的路徑。

當您調用class.getResource()時,該文件應該與該類在同一個包中找到。如果YAML文件是在同一水平的封裝結構,那麼你應該使用

.getClass().getClassLoader().getResourceAsStream() instead. 

即對於com.abc.def.MyClass.getClass()的getResourceAsStream(),該文件應該在/ COM/abc/def /文件夾。

即對於com.abc.def.MyClass.getClass()。getClassLoader()。getResourceAsStream(),該文件應與/ com位於同一文件夾中。

編輯

與資源串一個斜線,這將是與使用getClassLoader()。所以在你的情況下,config.yaml應該在類路徑的頂層找到。

+0

在Java中沒有任何方法可以獲取放置在項目文件夾下的文檔,而不是在任何包中? –

+1

在運行時,Java沒有項目文件夾的概念;一堆.getResource()方法都基於ClassLoader和classpaths運行。您可以使用Class.getResource()以及調用類的相對路徑,也可以使用ClassLoader.getResource()以及相對於classpath的路徑。 –