簡體   English   中英

嘗試讀取文件時出現奇怪的NoSuchFileException

[英]Strange NoSuchFileException when trying to read a file

File privateKeyFile = new File(this.getClass().getClassLoader().getResource("privateKey").getFile());

成功給了我一個keyFile。 如果我現在列出以下路徑:

privateKeyFile.toPath()

調試成功向我顯示了文件的路徑:

文件:/Users/me/.m2/repository/com/xx/xyz/abc/encryption/1.0/encryption-1.0.jar!/ privateKey

-

但是,一旦我嘗試讀取該文件,

Files.readAllBytes(privateKeyFile.toPath())

我懂了

方法拋出“ java.nio.file.NoSuchFileException”異常。

這真的很令人困惑,我嘗試將getResource()更改為諸如getResource("/privateKey");類的各種東西getResource("/privateKey"); -但是這個錯誤要早得多,實際上是嘗試創建new File()時的NPE權限,因此該文件必須存在,如我上面所示?

多虧了回復,我現在可以成功使用此代碼

//working
InputStream publicKeyStream = this.getClass().getClassLoader().getResourceAsStream("publicKey");
toByteArray(privateKeyStream));

我最初嘗試了給定的其他方法,但是導致BadPaddingException,這可能是由於未完全讀取文件導致的

//The incorrect code:

byte[] array = new byte[in.available()];
in.read(array);

File的構造函數並不關心路徑字符串是否實際指向現有文件,因此請不要依賴於它來檢查文件是否存在。 請改用privateKeyFile.exists() (如果文件存在,則返回true )。 從我的角度來看,該文件確實不存在或您提供的路徑不正確,因此exists()應該返回false。

由於該文件位於您的Jar內,因此Java無法將其識別為實際的“文件”。 因此,您必須閱讀一些不同的內容。 根據這篇文章 ,您可能會讀到以下內容:

InputStream in = getClass().getResourceAsStream("privatekey");

byte[] array = new byte[in.available()];
in.read(array);

或者您使用的是Java 9+,可能看起來像這樣:

InputStream in = getClass().getResourceAsStream("privatekey"); 
byte[] array = in.readAllBytes();

編輯:由於有些人想要一個具有讀取功能的完整源代碼的示例,因此您可以執行以下操作:

InputStream in = getClass().getResourceAsStream("privatekey"); 

List<Byte> bytes = new ArrayList<Byte>();
while(in.available() > 0) {
    byte[] b = new byte[in.available()];
    in.read(b);
    bytes.addAll(b);
}

byte[] array = (byte[]) bytes.toArray();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM