Jak vytvořit Jar soubor, které obsahují externí soubory

0

Otázka

Chci, aby zahrnovala text souboru zdroje složky do souboru Jar. Zde je minimální pří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 );
        }
    }
}

Zde je to, co je v test.txt soubor:

hello
world

To je, jak můj projekt vypadá:

enter image description here

Mohu spustit kód úspěšně. Jak jsem vygenerovaný Jar je následující:

enter image description here

Již jsem přidal zdroje složku, kliknutím na symbol"+". Nicméně, když jsem volat generovaného souboru Jar, to je pořád stěžovat FileNotFoundException.

Nějaké návrhy?

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

Nejlepší odpověď

1

new File představuje Soubor. Stejně jako v souboru. Položky v jar souboru, není Soubor.

Váš kód nemůže pracovat pro to, co chcete dělat.

Soubor je špatná abstrakce. Chcete InputStream nebo možná URL, z nichž oba mohou reprezentovat soubory, síťové proudy, on-the-fly generované věci, a ano, položky v jar soubory.

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 věcí se děje v tomto úryvku:

  • Použití ThisClass.classne getClass(). Na getClass trasy přestávky, když jste podtřídy. Nemusí tak učinit zde, ale možná později; je lepší psát kód, který vždy funguje, když to je stejně krátký.
  • Je to zdroj, musíte jej zavřít. Tento kód proto používá try-s-prostředky.
  • Dostaneme InputStream (getResourceAsStream vrací inputstream), který je na správné úrovni abstrakce, že může představovat vstup dovnitř sklenice (vs File což prostě nemůže dělat, že).
  • Řekneme, skener, co charset kódování. Jinak dostanete platforma default,, co je špatné a ošklivé: Na vašem vlastním počítači, bude to vždycky fungovat, pak jej spustit na jiném systému, a to se nezdaří. Vždy, vždy specifikovat charset kódování kdykoliv bajtů se obrátil do znaků (nebo naopak).
  • e.printStackTrace() je zlo. Neříkej, zpracování výjimek, že způsob,. Pokud máte tušení, (a že je to fér, když to hází IOEx, očividně je něco špatně a je to dobrý nápad, aby vaše aplikace, aby jen pád s tak podrobně, jak je to možné) - výše je správný způsob, jak se s tím vypořádat.
2021-11-18 02:07:53

V jiných jazycích

Tato stránka je v jiných jazycích

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