Ako vytvoriť súbor Jar, ktoré zahŕňajú externých súborov

0

Otázka

Chcem obsahovať textový súbor do priečinka zdroje na Jar súbor. Tu je minimálna príklad:

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

Tu je to, čo je v test.txt súbor:

hello
world

To je, ako môj projekt vyzerá:

enter image description here

Môžem spustiť kód úspešne. Ako som generované Jar je nasledovný:

enter image description here

Už som pridané zdroje priečinok kliknutím na "+" symbol. Avšak, keď som hovor vygenerovaný súbor Jar, je to stále sťažujú, FileNotFoundException.

Všetky návrhy?

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

Najlepšiu odpoveď

1

new File predstavuje Súbor. Napríklad súbor. Zápis v jar súbor nie je Súbor.

Kód nemôže pracovať na tom, čo chcete urobiť.

Súbor je nesprávny odber. Chcete InputStream prípadne adresa URL, ktoré môžu predstavujú súbory, siete potokov, on-the-fly generované veci, a, áno, záznamy v jar súbory.

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

Pár vecí sa deje v tejto úryvok:

  • Použitie ThisClass.classnie getClass(). Na getClass trasy prestávky, keď ste podtrieda. Nemusí tak urobiť tu, ale možno neskôr, je to lepšie napísať kód, ktorý vždy funguje, keď je to jednoducho ako krátke.
  • Je to prostriedok, musíte zavrieť. Tento kód sa preto používa try-s-zdrojov.
  • Sme si InputStream (getResourceAsStream vráti inputstream), ktorá je tým pravým úrovni abstrakcie, ktoré môžu predstavovať vstup vnútri jar (vs File ktoré jednoducho nemôže urobiť).
  • Sme povedať, skener, čo znakovú sadu a kódovanie je. V opačnom prípade sa môžete dostať platformu predvolené, čo je zlé a škaredé: Na vašom vlastnom počítači, bude vždy fungovať, potom ho spustiť na inom systéme, a to nepodarí. Vždy, vždy uviesť znakovú sadu a kódovanie kedykoľvek bajty sú premenil znakov (alebo naopak).
  • e.printStackTrace() je zlé. Nenechajte si niekedy rukoväť výnimky, ktoré ceste. Ak nemáte predstavu (a že je spravodlivý tu; ak sa to hodí IOEx, jasne, že je niečo zle, zle, a je to dobré pre vašu aplikáciu len zrážke s toľko podrobností, ako je to možné) - vyššie je správny spôsob, ako sa s tým vyrovnať.
2021-11-18 02:07:53

V iných jazykoch

Táto stránka je v iných jazykoch

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