2016-07-26 65 views
0

我有一組文件作爲資源附加到我的項目中。這些文件包含程序讀取和處理的數據。 這就是我要做的事:用空格和西里爾文符號名稱讀取資源文件

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();  
InputStream inputStream = classLoader.getResourceAsStream(filename);    
packageParameters = IOUtils.toString(inputStream, "UTF-8");      
inputStream.close();  

,一切都很好,直到我試圖像具體的名稱來讀取文件:

\sets\Тех. тип = 0 Сет. = 1 Комплект 1.qr 

getResourceAsStream回報null這意味着它無法找到該資源。

所以,問題是:如何讀取包含西里爾文符號,空格和名稱中特殊符號的文件? 試圖編碼名稱 - 沒有幫助。無法將其轉換爲URI,因爲構造函數會爲非法符號引發異常。

任何想法讚賞。 花了一些時間分析類似的答案 - 仍然不知道如何解決它。

+1

感謝尼古拉爲了更新問題! –

+0

你有控制文件命名嗎? – injecteer

+0

不,我對文件名的生成方式沒有任何影響。我也想過重命名它們。但要在程序中對它們進行重命名,我需要能夠將它們定位爲資源,這正是我想要做的:) –

回答

2

嘗試刪除尾部斜槓並用/替換\

我把文件Тех. тип = 0 Сет. = 1 Комплект 1.qrsrc\main\resources\sets與內容

123 

這對我的作品

import org.apache.commons.io.IOUtils; 
import java.io.IOException; 
import java.io.InputStream; 

public class Application { 
    public static void main(String[] args) throws IOException { 
     String filename = "sets/Тех. тип = 0 Сет. = 1 Комплект 1.qr"; 
     ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
     InputStream inputStream = classLoader.getResourceAsStream(filename); 
     String packageParameters = IOUtils.toString(inputStream, "UTF-8"); 
     inputStream.close(); 
     System.out.println(packageParameters); // prints 123 
    } 
} 

該類位於src\main\java\Application.java的來源。所有路徑都與項目的根目錄有關。

+0

感謝您的回答。已經嘗試過不同的斜槓類型,包括您提出的方法。又一次 - 這段代碼成功處理了常規文件,但對於我的特定文件,InputStream仍爲空。忘了提及我使用Windows機器來運行應用程序,它可以是它爲什麼在你身邊工作不同的原因(我猜你使用Mac或Linux,對不對?) –

+0

@KonstantinDobroliubov不,我使用Windows。同樣在['ClassLoader'參考文獻](http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html)中聲明_資源的名稱是一個'/'分隔的路徑標識資源的名稱。可能它與目錄有關?或者甚至文件的名稱在程序內部是不正確的,例如之前或之後的空格? – NikolayKondratyev

+0

標記答案是有效的,因爲它確實有效。然而,問題在於我如何處理文件名。它由於錯誤的轉換操作而被截斷。謝謝大家,夥計!你做了我的一天。 –

相關問題