Как создать файл Jar, содержащий внешние файлы

0

Вопрос

Я хочу включить текстовый файл в папку ресурсов в файл Jar. Вот минимальный пример:

import java.io.File;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Main main = new Main();
        main.readFile( "test.txt" );
    }

    public void readFile(String fileName){
        File file = new File( getClass().getResource( fileName ).getPath() );

        try{
            Scanner scanner = new Scanner( file );
            while ( scanner.hasNextLine() ){
                System.out.println( scanner.nextLine() );
            }
        }catch (Exception e){
            System.out.println( e );
        }
    }
}

Вот что находится в test.txt файл:

hello
world

Вот как выглядит мой проект:

enter image description here

Я могу успешно запустить код. Способ, которым я создал Jar, выглядит следующим образом:

enter image description here

Я уже добавил папку ресурсов, нажав на символ"+". Однако, когда я вызываю сгенерированный файл Jar, он все еще жалуется на исключение FileNotFoundException.

Есть какие-нибудь предложения?

intellij-idea jar java
2021-11-18 02:01:21
1

Лучший ответ

1

new File представляет собой файл. Как в файле. Запись в файле jar - это не файл.

Ваш код не может работать для того, что вы хотите сделать.

Файл - это неправильная абстракция. Ты хочешь InputStream или, возможно, URL-адрес, оба из которых могут представлять файлы, сетевые потоки, сгенерированные на лету материалы и, да, записи в файлах jar.

public void readFile(String fileName) {
  try (var in = ThisClass.class.getResourceAsStream(fileName)) {
    Scanner scanner = new Scanner(in, StandardCharsets.UTF_8);
    // proceed here.
  } catch (IOException e) {
    throw new RuntimeException("Uncaught", e);
  }
}

В этом фрагменте происходит несколько вещей:

  • Воспользуйся ThisClass.class, не getClass(). Маршрут getClass прерывается при создании подкласса. Возможно, вы не сделаете этого здесь, но можете сделать это позже; лучше писать код, который всегда работает, когда он такой же короткий.
  • Это ресурс, вы должны его закрыть. Поэтому в этом коде используется функция "попробуй с ресурсами".
  • Мы получаем входной поток (getResourceAsStream возвращает входной поток), который является правильным уровнем абстракции, который может представлять запись внутри jar (vs File который просто не может этого сделать).
  • Мы сообщаем сканеру, какова кодировка кодировки. В противном случае вы получите платформу по умолчанию, что неправильно и неприятно: на вашем собственном компьютере она всегда будет работать, затем вы запустите ее в другой системе, и она выйдет из строя. Всегда, всегда указывайте кодировку набора символов в любое время, когда байты превращаются в символы (или наоборот).
  • e.printStackTrace() это зло. Никогда не обрабатывайте исключения таким образом. Если вы понятия не имеете (и это справедливо здесь; если это вызывает ioeX, очевидно, что - то сильно не так, и для вашего приложения было бы хорошей идеей просто сбросить как можно больше деталей) - вышеизложенное-правильный способ справиться с этим.
2021-11-18 02:07:53

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

Популярное в этой категории

Популярные вопросы в этой категории