Исключение filenotfoundexception. Работает и не работает одновременно?


У меня есть следующий код в статическом классе под названием Methods, который архивируется в jar:

System.out.println(Methods.class.getResource("tagdict.txt")); // 1
URL test = Methods.class.getResource("tagdict.txt");          // 2
System.out.println(test.getPath());                           // 3
TagDictionary dict = new POSDictionary(test.getPath());       // 4

Первый System.out (1) говорит:

rsrc:de/fhg/scai/bio/harsha/classificationworkflow/tagdict.txt

Второй System.out (2) говорит:

de/fhg/scai/bio/harsha/classificationworkflow/tagdict.txt

Строка 4 бросает

java.io.FileNotFoundException: de/fhg/scai/bio/harsha/classificationworkflow/tagdict.txt (No such file or directory)

Файл tagdict.txt помещается в тот же пакет, что и Method.class, который является de/fhg/scai/bio/harsha/classificationworkflow.

Я не понимаю, почему строка 4 выбрасывает FileNotFoundException, хотя файл был найден уже внутри банки.
1 3

1 ответ:

Строка 3 просто выводит компонент пути URL-адреса, возвращенного getResource. На самом деле он не проверяет, представляет ли этот путь реальный файл на диске.

Похоже, что конструктор POSDictionary пытается создать File, используя переданную ему строку пути, и этот путь на самом деле не представляет собой файл на диске, поэтому создается исключение.

Я не понимаю, почему строка 4 вызывает исключение FileNotFoundException, хотя файл был найден уже внутри кувшин.

Потому что если ресурс находится в банке, то это не файл. Доступ к таким ресурсам возможен только при открытии входных потоков непосредственно из объекта URL или при использовании getResourceAsStream() вместо getResource(). Они не могут быть доступны с помощью java.io.File, так как они не являются настоящими дисковыми файлами.