Cum de a construi un fișier Jar care includ fișiere externe

0

Problema

Vreau să includ textul fișier în directorul de resurse pentru fișierul Jar. Aici este minimă exemplu:

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 );
        }
    }
}

Aici este ceea ce este în test.txt fișier:

hello
world

Acesta este modul în proiectul meu arata ca:

enter image description here

Eu pot rula codul cu succes. Modul în care am generat Borcan este după cum urmează:

enter image description here

L-am adaugat deja resurse folder făcând clic pe simbolul"+". Cu toate acestea, atunci când eu numesc generat fișier Jar, este încă proteste FileNotFoundException.

Orice sugestii?

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

Cel mai bun răspuns

1

new File reprezintă un Fișier. Ca într - un fișier. O intrare într-un borcan de fișiere nu este un Fișier.

Codul nu poate funcționa pentru ceea ce vrei să faci.

Fișierul este greșit abstractizare. Vrei InputStream sau, eventual, URL-ul, ambele din care pot reprezenta fișiere, fluxuri de rețea, pe-the-fly generate lucruri, și, da, intrările în fișierele 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);
  }
}

Câteva lucruri se întâmplă în acest fragment:

  • Utilizarea ThisClass.classnu getClass(). La getClass traseu pauze atunci când vă subclasă. Tu nu ar putea face acest lucru aici, dar s-ar putea mai târziu; este mai bine pentru a scrie cod care funcționează întotdeauna când e la fel de scurt.
  • E o resursă, trebuie să închideți-l. Acest cod se utilizează, prin urmare, să încerce-cu-resurse.
  • Avem un InputStream (getResourceAsStream returnează un inputstream), care este nivelul de abstractizare care pot reprezenta o intrare într-un borcan (vs File care pot face asta).
  • Vom spune scanner ce charset codare este. În caz contrar, veți obține platforma default,, care este rău și nesuferit: de Pe computerul dumneavoastră va funcționa întotdeauna, apoi rulați-l pe un alt sistem și nu reușește. Mereu, mereu specifica setul de caractere de codificare oricând bytes sunt transformate în caractere (sau invers).
  • e.printStackTrace() este răul. Să nu mai ocupe de excepții de acest fel. Dacă nu aveți nici o idee (și asta e corect aici; dacă acest lucru aruncă IOEx, clar ceva e greșit și că e o idee bună pentru aplicația să se prăbușească cu cât mai multe detalii este posibil) - cele de mai sus este modul corect de a face cu ea.
2021-11-18 02:07:53

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................