2017-01-16 51 views
1

我使用:路徑不能正常工作;使用文件分割符

  • JDK 1.8.0.71
  • 的IntelliJ 2016年3月2日
  • Win7的

我很好奇,爲什麼這條路是行不通的:

public static final String ZPL_TEMPLATE = 
        File.separator 
        + "templates" 
        + File.separator 
        + "Template.txt"; 

這個工作正常:

public static final String TEMPLATE = "/templates/Template.txt"; 

這裏是用於指(這是在另包):

InputStream is = this.getClass().getResourceAsStream(TEMPLATE); 

編輯:除外:在Win 7

... 
java.lang.NullPointerException: null 
    at java.io.Reader.<init>(Reader.java:78) 
    at java.io.InputStreamReader.<init>(InputStreamReader.java:72) 
    ... 
+0

道歉的非常愚蠢的問題,但你確定「/templates/ZPLTemplate.txt」存在?您在工作時給出的例子是「/templates/Template.txt」,沒有ZPL。只是檢查。 – phss

+0

另外,您能否告訴我們您收到錯誤的詳細信息? – phss

+0

嘗試使用'FileSystems.getDefault()。getSeparator();' – Jobin

回答

2

當訪問內部資源時,就像使用getResouceAsStream一樣,文件分隔符必須是/

我相信你在Windows機器上,所以文件分隔符是\

有關更多信息,請參見How to use file separator when loading resources

+0

您提供的鏈接不起作用(至少不適用於我) –

+0

已修復。這是最後一個額外的空間......謝謝,@ 4673_j – Zack

+0

對..我希望有某種系統分隔符;但我想簡單會更好,在提供的鏈接中相當清晰。那就是正斜槓了。 –

2

Becaseuse文件分離器是 '\' 和正如它在doc中爲指出的那樣getResourceAsStream

在委派之前,使用此算法從給定資源名稱構建絕對資源名稱:

如果名稱以'/'('\ u002f')開頭,則資源的絕對名稱是部分'/'後面的名稱。 否則,絕對名稱的格式如下: modified_pa​​ckage_name/name 其中,modified_pa​​ckage_name是此對象的包名稱,其中'/'替換爲'。'。 ( '\ u002e')。

1

getResourceAsStream期望資源名稱作爲參數,而不是文件路徑。

資源名稱在java中由前斜槓分隔/,無論文件系統(資源名稱/路徑代表的類路徑上,而不是在文件系統中的路徑)。

因此,您不能使用文件系統分隔符來構建資源名稱。在Windows上,它將是一個反斜槓\