繁体   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