为什么getClass()。getResource有RandomAccessFile / ReversedLinesFileReader(Apache Commons)的问题?

时间:2018-04-18 14:33:00

标签: java eclipse io

我在资源文件夹中有我的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。

1 个答案:

答案 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_pa​​ckage_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,这可能会限制您阅读内容的选项。