Come creare un file Jar che includere file esterni

0

Domanda

Voglio includere il file di testo nella cartella risorse del file Jar. Qui è il minimo esempio:

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

Ecco cosa c'è nella test.txt file:

hello
world

Questo è come il mio progetto si presenta come:

enter image description here

Posso eseguire il codice correttamente. Il modo in cui ho generato Vaso è come segue:

enter image description here

Ho già aggiunto risorse cartella, fate clic sul simbolo"+". Tuttavia, quando l'ho chiamata generato il file Jar, è ancora lamentarsi FileNotFoundException.

Qualche suggerimento?

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

Migliore risposta

1

new File rappresenta un File. Come in un file. Una voce in un file jar non è un File.

Il tuo codice non funziona per quello che vuoi fare.

Il File è sbagliato astrazione. Vuoi InputStream o, eventualmente, URL, entrambi i quali possono rappresentare i file, flussi di rete, on-the-fly generato roba, e, sì, le voci nel file 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);
  }
}

Un paio di cose in quel frammento:

  • Utilizzare ThisClass.classnon getClass(). Il getClass percorso si rompe quando si sottoclasse. Si potrebbe non farlo qui, ma si potrebbe più tardi, è meglio scrivere il codice che funziona sempre quando è breve.
  • È una risorsa, è necessario chiuderlo. Questo codice utilizza quindi provare-con-le risorse.
  • Abbiamo un InputStream (getResourceAsStream restituisce un inputstream), che è il giusto livello di astrazione che può rappresentare una voce all'interno di un vaso (vs File che semplicemente non può farlo).
  • Diciamo che lo scanner che il set di caratteri codifica. Altrimenti si ottiene piattaforma di default, che è sbagliato e di brutto: Sul tuo computer sarà sempre funziona, quindi si esegue su un altro sistema e non riesce. Sempre, sempre specificare il set di caratteri di codifica in qualsiasi momento byte sono trasformati in caratteri (o viceversa).
  • e.printStackTrace() è il male. Non sempre gestire le eccezioni in quel modo. Se non avete idea di che fiera qui; se ciò genera IOEx, chiaramente qualcosa è seriamente sbagliato ed è una buona idea per la vostra app di solo crash con il maggior dettaglio possibile) - il sopra è il modo giusto per affrontare con esso.
2021-11-18 02:07:53

In altre lingue

Questa pagina è in altre lingue

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