Comment construire un fichier Jar inclure des fichiers externes

0

La question

Je veux inclure le fichier texte dans le dossier de ressources pour le fichier Jar. Voici l'exemple minimal:

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

Voici ce qui est dans le test.txt fichier:

hello
world

C'est ainsi que mon projet ressemble:

enter image description here

Je peux exécuter le code avec succès. La façon dont je Jar généré est comme suit:

enter image description here

J'ai déjà ajouté des ressources dossier en cliquant sur "+" symbole de. Cependant, lorsque j'appelle le fichier Jar généré, il est toujours à se plaindre FileNotFoundException.

Toutes les suggestions?

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

La meilleure réponse

1

new File représente un Fichier. Comme dans un fichier. Une entrée dans un fichier jar n'est pas un Fichier.

Votre code ne peut pas fonctionner pour ce que vous voulez faire.

Fichier est la mauvaise abstraction. Vous voulez InputStream ou, éventuellement, URL, ce qui peut représenter des fichiers, flux réseau, à la volée généré des choses, et, oui, les entrées dans les fichiers 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);
  }
}

A peu de choses sont en cours dans ce morceau de code:

  • Utilisation ThisClass.class, pas getClass(). Le getClass route des pauses lorsque vous sous-classe. Vous ne pourriez pas le faire ici, mais vous pourriez plus tard; c'est mieux d'écrire du code qui fonctionne toujours quand il est tout aussi court.
  • C'est une ressource, vous devez la fermer. Ce code utilise donc try-with-resources.
  • Nous obtenons un InputStream (getResourceAsStream retourne un inputstream), qui est le bon niveau d'abstraction qui peut représenter une entrée à l'intérieur d'un bocal (vs File qui juste ne peut pas le faire).
  • Nous dire le scanner ce que l'encodage de caractères est. Sinon vous avez de la plateforme par défaut, ce qui est faux et méchant: Sur votre propre ordinateur, il va toujours travailler, puis de l'exécuter sur un autre système et il échoue. Toujours, toujours spécifier l'encodage de caractères à tout moment octets sont transformés en caractères (ou vice versa).
  • e.printStackTrace() c'est le mal. Ne jamais traiter les exceptions de cette façon. Si vous n'avez aucune idée (et c'est juste ici; si ce lève IOEx, clairement quelque chose est mal et c'est une bonne idée pour votre application de simplement écraser avec autant de détails que possible) - le ci-dessus est la bonne façon de traiter avec elle.
2021-11-18 02:07:53

Dans d'autres langues

Cette page est dans d'autres langues

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