Странное NoSuchFileException при попытке прочитать файл - PullRequest
0 голосов
/ 05 апреля 2019
File privateKeyFile = new File(this.getClass().getClassLoader().getResource("privateKey").getFile());

успешно дает мне ключевой файл.Если я теперь перечислю путь с помощью:

privateKeyFile.toPath()

, отладка успешно покажет мне путь к файлу:

file: /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"); - но это ошибки намного раньше, на самом деле NPE прямо при попытке создать new File(), поэтому файл ДОЛЖЕН существовать, как я показал выше ??

Ответы [ 3 ]

0 голосов
/ 05 апреля 2019

Конструктор File не заботится о том, действительно ли строка пути указывает на существующий файл, поэтому не полагайтесь на это, чтобы проверить, существует ли файл там или нет. Вместо этого используйте privateKeyFile.exists() (возвращается файл true, если файл существует). Из того, что я вижу, файла на самом деле нет, или указанный вами путь неверен, поэтому exists() должно возвращать false.

0 голосов
/ 05 апреля 2019

Благодаря ответам я теперь успешно использую этот код

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

Я изначально попробовал другой метод, который был указан, но это привело к исключению BadPaddingException, вероятно, из-за неполного чтения файла

//The incorrect code:

byte[] array = new byte[in.available()];
in.read(array);
0 голосов
/ 05 апреля 2019

Поскольку файл находится внутри вашего 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...