FileNotFoundException при работе в качестве jar

FileInputStream fstream = new FileInputStream("abc.txt")

выдает FileNotFoundExceptionn во время работы в качестве jar. Почему ? Обычно он может найти во время работы из основного метода.


person Subhajit    schedule 20.01.2017    source источник
comment
вы должны быть уверены, что путь к файлу такой же, как и при запуске приложения из .jar. у вас есть abc.txt в той же папке, что и .jar   -  person Karim    schedule 20.01.2017


Ответы (5)


Если ваш файл упакован с вашей банкой, вы должны получить информацию, используя getClass().getResource(url):

FileInputStream inputStream = 
new FileInputStream(new File(getClass().getResource(/path/to/your/file/abc.txt).toURI()));

В противном случае вам нужно всегда создавать его на том же пути, что и ваша банка, и вы можете получить его так же, как и вы:

src/myJar.jar
src/folder/abc.txt

FileInputStream fstream = new FileInputStream("folder/abc.txt");

Вы также можете прочитать здесь:

Как загрузить файл из папки ресурсов? и Загрузка файла с помощью getClass().getResource()

person YCF_L    schedule 20.01.2017
comment
если этот код работает нормально, пока я запускаю проект напрямую, то почему компилятор не может найти текстовый файл после его создания в виде jar? При создании jar файлы, находящиеся вне папки src, не включаются в jar? - person Subhajit; 20.01.2017
comment
поскольку файл не существует в той же папке вашей банки, какую IDE вы используете Netbeans или Eclipse? если вы используете Netbeans, то ваша банка находится в папке project\dist\jarfile.jar, надеюсь, вы поняли мою точку зрения @subhajit - person YCF_L; 20.01.2017

class MyClass{

    InputStream fstream = this.getClass().getResourceAsStream("abc.txt");

}

Этот код следует использовать. И файлы (в данном случае abc.txt) должны храниться в расположении класса ссылок на объекты. Это означает, что this.getClass относится к расположению некоторой папки, т. е. папки com/myfolder/MyClass.java.

Поэтому мы должны хранить abc.txt в папке com/myfolder в этом месте.

person Subhajit    schedule 23.01.2017

Вы можете использовать FileInputStream только тогда, когда у вас действительно есть файл в файловой системе компьютера. Когда вы упаковываете свой текстовый файл в файл jar для своей программы, это не файл в файловой системе. Это запись внутри файла jar.

Хорошая новость заключается в том, что в Java еще проще получить доступ к файлу таким образом: он находится в вашем пути к классам, поэтому вы можете использовать getResourceAsStream().

InputStream stream = getClass().getResourceAsStream("abc.txt");

Если у вас правильно настроен путь к классам, это будет работать независимо от того, является ли это файлом в каталоге (например, во время разработки) или записью в файле jar (например, при выпуске).

person dsh    schedule 20.01.2017

Это потому, что ваш рабочий каталог, вероятно, будет отличаться в двух средах. Попробуйте добавить строку

System.out.println(new File("abc.txt").getAbsolutePath());

чтобы увидеть, где он на самом деле ищет файл.

person Steve Smith    schedule 20.01.2017
comment
Файл out2 = новый файл (папка/mytext.txt); System.out.println(path2: +out2.getAbsolutePath()); FileInputStream fstream = новый FileInputStream(out2.getAbsolutePath()); path2 : E:\Projects\GLB\folder\mytext.txt java.io.FileNotFoundException: E:\Projects\GLB\folder\mytext.txt (Система не может найти указанный путь) Получение этого исключения. - person Subhajit; 20.01.2017
comment
Существует ли файл E:\Projects\GLB\folder\mytext.txt и есть ли у вас разрешение на его чтение? - person Steve Smith; 20.01.2017
comment
Да @stevesmith. - person Subhajit; 21.01.2017

Может быть, не самый элегантный, но именно так вы можете охватить все параметры в Scala

def loadFile(path: String) = {
    val f = new File(path)
    if (f.exists) {
      loadFileFromPath(path)
    } else {
      val r = Try {
        val in = ClassLoader.getSystemResourceAsStream(path)
        new InputStreamReader(in)
      }.getOrElse{
        val in = getClass.getResourceAsStream(s"/$path")
        new InputStreamReader(in)
      }
      loadFileFromInputStream(r)
    }
  }
person Atais    schedule 14.09.2017