我在名为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
,即使文件已经在jar中找到了。
答案 0 :(得分:4)
第3行只打印出getResource
返回的网址的路径组件。它实际上并不检查该路径是否代表磁盘上的真实文件。
看起来POSDictionary
构造函数正在尝试使用传递给它的路径字符串创建File
,并且此路径实际上并不表示磁盘上的文件,因此抛出异常。
我不明白为什么第4行会抛出FileNotFoundException,即使文件已经在jar中找到了。
因为如果资源在JAR中,那么它不是文件。只能通过直接从URL
对象打开输入流,或使用getResourceAsStream()
而不是getResource()
来访问此类资源。无法使用java.io.File
访问它们,因为它们不是实际的磁盘文件。