2015-12-11 9 views
0

Я пробовал это разными способами и выполнял несколько онлайн-инструкций, таких как это - Eclipse exported Runnable JAR not showing images Но пока успеха нет.Как я могу упаковать файл ресурсов в runnable jar

У меня очень простая программа, которая читает текстовый файл (test.txt) и выводит его содержимое на стандартный вывод. Я использую Eclipse. Вот что у меня есть done-

  • Я положил текстовый файл в папку под названием «ресурсы»
  • Я щелкнул правой кнопкой мыши папку ресурсов, выбранных «Построить путь» и нажмите «Использовать в качестве папки ресурсов»
  • В моем коде я пробовал два способа обращения к файлу - (a) как «/test.txt» и (b) как «resources/test.txt». Последний метод работает, когда я запускаю программу в Eclipse. , ни один из методов не работает, когда я экспортирую проект в виде исполняемого файла jar. Папка ресурсов не может быть включена в файл jar.

Любая помощь будет высоко оценена.

Приложение: Вот код.

public class FileIOTest { 

public static void main(String[] args) { 
    String line; 
    try { 
     BufferedReader br = new BufferedReader(new FileReader(new File("/test.txt"))); 
     while((line = br.readLine()) != null){ 
      System.out.println(line); 
     } 

    br.close(); 
    } 
    catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} 

} 

}

+0

Показать фактический код загрузки файла. –

+0

Публичный класс FileIOTest { \t public static void main (String [] args) { \t \t Строка; \t try { \t \t \t BufferedReader br = new BufferedReader (новый FileReader (новый файл ("/ test.txt"))); \t \t \t в то время как ((строка = br.readLine())! = NULL) { \t \t \t \t System.out.println (линия); \t \t \t} \t \t \t \t \t br.close(); \t \t \t} \t \t улов (FileNotFoundException е) {e.printStackTrace();} поймать (IOException е) {e.printStackTrace();} \t} } – user3516726

+0

Возможная Дубликат [Eclipse, экспортированы Runnable JAR не показывать изображения] (http://stackoverflow.com/questions/25635636/eclipse-exported-runnable-jar-not-showing-images) – khuderm

ответ

5

Вы не можете получить доступ к ресурсу в файл Jar через FileReader, потому что это не файл в файловой системе. Java имеет механизм доступа к ресурсам в вашем пути к классам (в том числе в Jars): ClassLoader.getResourceAsStream(). Вы можете использовать его с вашим умолчанию загрузчик классов:

BufferedReader br = new BufferedReader(new InputStreamReader(
         ClassLoader.getSystemClassLoader() 
            .getResourceAsStream("resource/test.txt"))); 

Обратите внимание, что getResourceAsStream возвращает null вместо того, чтобы выбросить исключение, так что вы можете получить поток первых, проверьте, если для null, то либо выбросить исключение или обработать его ,

Вы должны указать полный путь в банке как свой путь.

+0

спасибо миллион. Это сработало. Я не знал о ResourceStream. – user3516726

+0

Это то, как вы получаете доступ к материалам, которые вы обычно получаете от ClassLoader. В принципе, все, что поступает из вашего дистрибутива приложения (т. Е. Находится на пути к классу приложения), должно быть прочитано таким образом. Возвращаемое значение 'null' отражает это: вещи, загруженные таким образом, намного надежнее, чем вещи из файловой системы. –

1

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

Ссылку вы предоставили, используется Class.getResource, который возвращает URL, но есть также Class.getResourceAsStream, которая возвращает InputStream, который можно обернуть в InputStreamReader. Например

InputStream is = FileIOTest.class.getResourceAsStream("/text.txt"); 
BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
1

Вы можете создать банку без затмения. Например, если у меня есть класс Demo в пакете src (каталог тот же), а файл ресурсов (testing.txt) находится в каталоге resources.Добавить Manifest.txt файл @ корень каталога:

Manifest-Version: 1.0 
Main-Class: src.Demo 

Demo класс выглядит следующим образом:

package src; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

public class Demo { 

    public static void main(String... args) { 

     try (BufferedReader br = new BufferedReader(new InputStreamReader(Demo.class.getResourceAsStream("/resources/testing.txt")))) 
     { 

      String sCurrentLine; 

      while ((sCurrentLine = br.readLine()) != null) { 
       System.out.println(sCurrentLine); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Файл testing.txt, как:

hello world 
How are you? 

Compile Demo.java получить Demo.class

javac src/Demo.java 

Создать jar

jar cfm myJar.jar Manifest.txt src/* resources/* 

И запустить его

java -jar myJar.jar 

В затмении, просто добавить папку ресурсов на пути к классам (убедитесь, что он находится в баночке), и читать его как путь к классам ресурс (метод getResourceAsStream)