我在资源文件夹中有我的txt文件(父文件夹是项目文件夹),这个资源文件夹是一个源文件夹(以便Eclipse自动将其内容复制到/ bin root)。在资源文件夹中,我有lottery_archives文件夹,其中有drawArchive_5x36.txt文件。我做了“清洁项目”并再次构建它。我检查了 - 文件存在于/bin/lottery_archives/drawArchive_5x36.txt
以下代码有什么问题?为什么FileNotFoundException?
顺便说一句,为什么所有那些用getClass()跳过getResource然后用URL-> String(我需要将String fileName赋给RandomAccessFile构造函数),我不完全理解为什么我不能给String“/ lottery_archives / drawArchive_5x36.txt“直接构造函数?我觉得有些东西可能与jar不同,而不是本地文件,但不能清楚地表达它。
import org.apache.commons.io.input.ReversedLinesFileReader;
public String readLastLine5x36() throws IOException {
String archiveFileName = "/lottery_archives/drawArchive_5x36.txt";
URL archiveURL = this.getClass().getResource(archiveFileName);
String fileName = archiveURL.toString();
File file = new File(fileName);
ReversedLinesFileReader reader = new ReversedLinesFileReader(file, Charset.forName("UTF-8"));
String result = reader.readLine();
archiveURL.toString返回"file:/L:/MySeriousProjects/JackPotAlert/JackPotAlert/bin/lottery_archives/drawArchive_5x36.txt"
错误Stacktrace:
Exception in thread "main" java.io.FileNotFoundException: \lottery_archives\drawArchive_5x36.txt (Системе не удается найти указанный путь)
at java.io.RandomAccessFile.open0(Native Method)
at java.io.RandomAccessFile.open(RandomAccessFile.java:316)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:243)
at org.apache.commons.io.input.ReversedLinesFileReader.<init>(ReversedLinesFileReader.java:135)
at org.apache.commons.io.input.ReversedLinesFileReader.<init>(ReversedLinesFileReader.java:78)
at com.codeuniverse.jackpotalert.domain.Archive.readLastLine5x36(Archive.java:128)
at com.codeuniverse.jackpotalert.domain.Archive.main(Archive.java:139)
尝试将URL转换为URI并将URI提供给RandomAccessFile构造函数(通过apache类)
String archiveFileName = "/lottery_archives/drawArchive_5x36.txt";
URL archiveURL = this.getClass().getResource(archiveFileName);
File file = new File(archiveURL.toURI());
产生URISyntaxException。
答案 0 :(得分:1)
您无法在应用程序的jar文件中的文件上使用this.getClass().getResource(archiveFileName)
。因为它不是一个单独的文件。
您需要使用this.getClass().getResourceAsStream(archiveFileName)
:
public InputStream getResourceAsStream(String name)
查找具有给定名称的资源。搜索资源的规则 与给定类相关联的是由定义类实现的 班级装载机。此方法委托给该对象的类 装载机。如果这个对象是由bootstrap类加载器加载的,那么 方法委托给 ClassLoader.getSystemResourceAsStream(java.lang.String中)。
在委托之前,从中构造绝对资源名称 使用此算法给定资源名称:
如果名称以
'/'
('\u002f'
)开头,则资源的绝对名称是'/'
后面的名称部分。 否则,绝对名称的格式如下:modified_package_name/name
其中modified_package_name是此对象的包名称,
'/'
替换为'.'
('\u002e'
)。参数:
name - name of the desired resource
返回:
A InputStream object or null if no resource with this name is found
抛出:
NullPointerException - If name is null
自:
JDK1.1
请注意,此方法会返回InputStream
,这可能会限制您阅读内容的选项。