2013-06-06 5 views
3

Ce que je tente de faire est de stocker un fichier texte (qui ne changera pas) dans le JAR du programme afin qu'il puisse être lu. Le but du fichier texte est qu'il sera lu par une de mes classes et le contenu du fichier texte sera ajouté à un JEditorPane. Le fichier sera essentiellement un tutoriel et lorsque l'utilisateur clique sur l'option pour lire le tutoriel, le contenu du fichier sera lu et affiché dans une nouvelle fenêtre qui apparaît. J'ai la partie de l'interface graphique vers le bas, mais dans la mesure où stocker le fichier dans le fichier JAR afin qu'il puisse être consulté, je suis perdu. J'ai lu que l'utilisation d'un InputStream fonctionnera, mais après avoir essayé quelques petites choses, je n'ai pas encore réussi à le faire fonctionner.Comment lire un fichier texte dans un fichier JAR?

Je stocke également des images dans le JAR à utiliser comme icônes pour les fenêtres GUI. Ceci est accompli avec:

private Image icon = new ImageIcon(getClass() 
    .getResource("resources/cricket.jpg")).getImage(); 

Mais, cela ne fonctionne pas lorsque vous essayez d'obtenir un fichier:

private File file = new File(getClass.getResource("resources/howto.txt")); 

Voici ma classe comme il est maintenant:

public class HowToScreen extends JFrame{ 

/** 
* 
*/ 
private static final long serialVersionUID = -3760362453964229085L; 
private JEditorPane howtoScreen = new JEditorPane("text/html", ""); 
private Image icon = new ImageIcon(getClass().getResource("resources/cricket.jpg")).getImage(); 
private BufferedReader txtReader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/resources/howto.txt"))); 

public HowToScreen(){ 
    setSize(400,300); 
    setLocation(500,200); 
    setTitle("Daily Text Tutorial"); 
    setIconImage(icon); 

    howtoScreen.setEditable(false); 
    howtoScreen.setText(importFileStream()); 
    add(howtoScreen); 
    setVisible(true); 
} 

public String importFile(){ 
    String text = ""; 
    File file = new File("howto.txt"); 
    Scanner in = null; 

    try { 
     in = new Scanner(file); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

    while(in.hasNext()){ 
     text += in.nextLine(); 
    } 

    in.close(); 
    return text; 
} 

public String importFileStream(){ 
    String text = ""; 
    Scanner in = new Scanner(txtReader); 

    while(in.hasNext()){ 
     text += in.nextLine(); 
    } 

    in.close(); 
    return text; 
} 
} 

Ignore la méthode importFile en cours de suppression au profit du stockage du fichier tutoriel à l'intérieur du JAR, rendant le programme entièrement autonome car je suis limité à la quantité d'espace que le programme peut utiliser. Après avoir essayé toutes les suggestions ci-dessous, j'ai vérifié pour voir si mon JAR empaquette le fichier texte dedans et il ne l'est pas. Lorsque j'ouvre le JAR avec 7zip, dans mon dossier de ressources, l'image que j'utilise pour les icônes est là, mais pas le fichier texte.

+0

Décrivez ce que "ne fonctionne pas" signifie. Si vous obtenez une erreur, montrez-nous l'erreur. –

+0

C'est '.getClass()'. – n1xx1

+0

Voir aussi http://stackoverflow.com/q/10452825/180100 –

Répondre

7

Vous ne pouvez pas utiliser Fichier dans un fichier JAR. Vous devez utiliser InputStream pour lire les données de texte.

BufferedReader txtReader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/resources/mytextfile.txt"))); 

// ... Use the buffered reader to read the text file. 
+1

Cela lance également une exception NullPointerException lorsqu'il tente d'obtenir le fichier. – user2434692

1

Votre code ne sera pas compilé. Class.getResource() renvoie URL et File n'a pas de constructeur avec un URL comme argument.

Vous pouvez simplement utiliser .getResourceAsStream() à la place, il renvoie directement un InputStream, il vous suffit de lire le contenu du fichier à partir de ce flux.

Note: si la ressource ne se trouve pas ces deux méthodes retour null: ne pas oublier de vérifier que ...

+0

En ce moment, tout ce que je récupère de l'InputStream est null, mais le fichier est là. – user2434692

+0

Il y a un autre problème ici. Vos images se chargent-elles correctement? – fge

+0

Les images se chargent correctement, mais jusqu'ici le fichier texte est la seule chose qui m'échappe. – user2434692

1

Essayez la prochaine (avec le paquet de chemin complet):

InputStream inputStream = ClassLoader.getSystemClassLoader(). 
     getSystemResourceAsStream("com/company/resources/howto.txt"); 
InputStreamReader streamReader = new InputStreamReader(inputStream, "UTF-8"); 
BufferedReader in = new BufferedReader(streamReader); 

for (String line; (line = in.readLine()) != null;) { 
    // do something with the line 
} 
Le contenu du fichier texte sera ajouté à un JEditorPane
+0

Le code s'exécute en une exception NullPointerException à: streamReader = new InputStreamReader (inputStream, "UTF-8"); – user2434692

1

.

Voir DocumentVewer & en particulier JEditorPane.setPage(URL).

Depuis l'aide est un il sera nécessaire d'obtenir un URL en utilisant getResource(String) comme indiqué dans le info. page.

.. essayé ceci: URL url = this.getClass().getResource("resources/howto.txt");

Change:

URL url = this.getClass().getResource("resources/howto.txt"); 

Pour:

URL url = this.getClass().getResource("/resources/howto.txt"); // note leading '/' 
+0

J'ai lu ceux-ci et j'ai essayé ceci: URL url = this.getClas.getResource ("resources/howto.txt"); howtoScreen.setPage (url); Avec ce morceau de code, je reçois une mauvaise exception d'URL, donc mon programme ne trouve pas le fichier? – user2434692

+0

Essayez le montage ... –

+0

Malheureusement, cela n'a pas fonctionné. – user2434692

Questions connexes