FileNotFoundException jar

di il
11 risposte

FileNotFoundException jar

Salve a tutti!
Da come scrivo nel titolo ho dei problemi con dei file nel jar ed in particolare sto provando ad aprire e sovrascrivere file.
Da come noto il problema sta solamente nell'esportazione del file o quasi diciamo.
Teoricamente la struttura delle mie cartelle è questa:
project
+src
-+ package1
-+ package2
+resources (varie foto)
testo1.txt
testo2.txt

"Per -+ intendo sottocartella"
Sto usando questi due metodi per aprire e sovrascrivere i file in Eclipse. In realta all'interno di Eclipse non trovo nessun problema:
Il mio bisogno è accedera alle risorse testo1 e testo2 dal package2 all'interno di un file.java (in particolare una class che estende JFrame)
Accedo in questo modo :
/*Lettura*/
File leggere = new File("testo1.txt");
try {
	Scanner leggiS = new Scanner(leggere);
        /*Dopo varie cose SCRIVO*/
        leggere.delete();
			try {
				leggere.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
        String newtesto = ecc;
        Files.write(FileSystems.getDefault().getPath(".", leggere.getName()), newtesto.toString().getBytes(), StandardOpenOption.TRUNCATE_EXISTING);

}catch ecc
Il problema sta sia se provo ad accedere ai File se li sposto in resources e sia che Esportando il progettp come jar quando richiamo quei metodi mi esce un filenotfound quando richiamo testo1.txt, in teoria dentro il jar lasciandoli nella root del progetto i file non vengono estratti ma se provo ad aggiungerli al jar mi viene richiamata sempre la stessa eccezione.
Come posso risolvere ? è urgente!

Grazie mille in anticipo spero di essere stato chiaro

11 Risposte

  • Re: FileNotFoundException jar

    Whowas ha scritto:


    File leggere = new File("testo1.txt");
    Una specifica di questo tipo vuol dire una cosa: che il file testo1.txt è relativo alla directory "corrente". Quale è la directory corrente? Beh, semplicemente dipende da come/da dove si avvia la JVM. Non c'entra tanto un IDE.
  • Re: FileNotFoundException jar

    Va bene su questo sono d'accordo, tuttavia non saprei come richiamare in un determinato file jar quel file e richiamarlo anche oppurtamente da un qualche IDE.
    Potresti farmi un esempio di come prendere quel file e farci delle elaborazioni, se secondo il mio schema si trova nella sottocartella resources del progetto ?
  • Re: FileNotFoundException jar

    Whowas ha scritto:


    Va bene su questo sono d'accordo, tuttavia non saprei come richiamare in un determinato file jar quel file e richiamarlo anche oppurtamente da un qualche IDE.
    Potresti farmi un esempio di come prendere quel file e farci delle elaborazioni, se secondo il mio schema si trova nella sottocartella resources del progetto ?
    Il fatto di avere una "resources" (come una "src") è soltanto nel tuo progetto, nel tuo IDE. Non necessariamente sarà così (sicuramente non la src) quando la tua applicazione dovesse "vivere" fuori da un IDE.

    Quindi la questione è: quando la applicazione girerà fuori da un IDE, avrai un jar principale della tua applicazione, giusto? E questi file txt DOVE vuoi che siano? Intendo dire in che relazione rispetto al jar o alla directory "corrente"?
  • Re: FileNotFoundException jar

    Allora per quanto riguarda il posizionamento (se ho ben capito la tua domanda), ho notato che estraendo il file come jar e esplodendolo come file zip noto che il jar è formato in questo modo:
    -+cartella package1
    -+cartella package2
    -+METAINF
    e a conclusione tutti i file che si trovano in resources...

    Questa disposizione a me sta benissimo, ovvero se inserisco nella cartella resources (Come IDE uso Eclipse) i file testo1 e testo2 mi sta bene.
    Alla fine dei giochi mi sta bene se i file siano messi in resources dentro Eclipse e mi sta bene quindi che una volta esportato il progetto che i file stiano dentro la root del jar.
    Il problema è che se li sposto in resources dentro Eclipse non riesco ad accedervi e salvare, ovvero eccezione FileNotFoundException e ugual problema sorge nel jar.
    L'unica alternativa funzionante per adesso, visto che come dici la JVM si avvia dentro la root del progetto in quel modo riesco ad accedervi ma dal jar se non sposto i file in resources non li esporta proprio i file e se li sposto in resources "ripeto" non riesco ad accedervi ne da Eclipse ne usando il programma (ovvero dal cmd java -jar nomejar.jar con successivo errore di eccezione, e non succede nulla essendo nel progetto il metodo collegato ad un ActionListener se avvio semplicemente il file eseguibile).
  • Re: FileNotFoundException jar

    Whowas ha scritto:


    Questa disposizione a me sta benissimo, ovvero se inserisco nella cartella resources (Come IDE uso Eclipse) i file testo1 e testo2 mi sta bene.
    Alla fine dei giochi mi sta bene se i file siano messi in resources dentro Eclipse e mi sta bene quindi che una volta esportato il progetto che i file stiano dentro la root del jar.
    Il problema è che se li sposto in resources dentro Eclipse non riesco ad accedervi e salvare, ovvero eccezione FileNotFoundException e ugual problema sorge nel jar.
    L'unica alternativa funzionante per adesso, visto che come dici la JVM si avvia dentro la root del progetto in quel modo riesco ad accedervi ma dal jar se non sposto i file in resources non li esporta proprio i file e se li sposto in resources "ripeto" non riesco ad accedervi ne da Eclipse ne usando il programma (ovvero dal cmd java -jar nomejar.jar con successivo errore di eccezione, e non succede nulla essendo nel progetto il metodo collegato ad un ActionListener se avvio semplicemente il file eseguibile).
    Allora, ascolta, stai facendo un po' di confusione.
    Se vuoi che dei file .txt vadano a finire DENTRO il jar, ok. Ma li dovresti trattare come "risorse" read-only, solo accessibili in lettura. E NON puoi più usare java.io.File. Trattandoli come risorse, devi referenziarli secondo il principio di ricerca offerto dai metodi getResource o getResourceAsStream di java.lang.Class.

    Se l'intenzione era quella di andare ad aggiornare dei txt che sono dentro il jar, sappi che NON dovresti farlo.
  • Re: FileNotFoundException jar

    Va bene ho capito, forse hai ragione faccio un pò di confusione. Tuttavia è mio bisogno modificare quei file ogni qualvolta succede una certa cosa, secondo te come dovrei procedere e quali accortezze devo usare ?
  • Re: FileNotFoundException jar

    Whowas ha scritto:


    Va bene ho capito, forse hai ragione faccio un pò di confusione. Tuttavia è mio bisogno modificare quei file ogni qualvolta succede una certa cosa, secondo te come dovrei procedere e quali accortezze devo usare ?
    Ma questi sono file di cui l'utente della applicazione non "sa" nulla? (cioè sono dati ad uso interno della applicazione) Oppure devono essere visti e gestiti dall'utente?

    Se sono file ad uso solo della applicazione, li puoi leggere/scrivere e in generale gestire sotto la directory "home" dell'utente. Per molte applicazioni, sia Java, sia "native", è abbastanza comune andare a creare una directory "punto qualcosa" (es. .myapp ) sotto la "home" dell'utente e metterci lì dentro configurazioni, dati, risorse, ecc...
  • Re: FileNotFoundException jar

    No sono modificati dall'applicazione sono io a gestire quei file all'interno non li faccio modificare all'utente.
    Comunque mi hai dato molti chiarimenti su molti aspetti, adesso andiamo al nocciolo come posso risolvere quel problema nel jar ? Come devo continuare ? Non so proprio come spostare e prendere il file nel jar.
  • Re: FileNotFoundException jar

    Whowas ha scritto:


    come posso risolvere quel problema nel jar ? Come devo continuare ? Non so proprio come spostare e prendere il file nel jar.
    Come ho detto prima NON si dovrebbe cercare di modificare file dentro il jar. Se ci sono file di dati/configurazioni dentro il jar allora: o sono cose fisse, statiche che vengono solo lette ed usate dalla applicazione ... oppure potrebbero essere dati "iniziali" o configurazioni di "default". In tal caso sarebbe bene leggerli e scaricarli altrove (es. sotto la home come dicevo). E chiaramente solo una prima volta, appena necessario.
  • Re: FileNotFoundException jar

    Va bene, ma il mio scopo e salvare e cambiare delle cose, in poche parole sto facendo un gioco in locale per pc e li dentro volevo salvare e aggiornare i record che l'utente fa quando il gioco termina e lui vince. Un file contiene il tempo e l'altro continue il nome, c'è un modo per salvare questi dati da qualche parte in locale e usarli tramite jar per modificarli e farli vedere dentro l'app ?
  • Re: FileNotFoundException jar

    Whowas ha scritto:


    c'è un modo per salvare questi dati da qualche parte in locale e usarli tramite jar per modificarli e farli vedere dentro l'app ?
    Ma l'ho detto prima: una soluzione tipica è metterli e gestirli da qualche parte sotto la (directory) "home" dell'utente. Che tra l'altro così diventano "per user", che non è male.

    Aggiornare file dentro il jar, come ripeto ancora, non si fa. Non è buono. Il jar poi potrebbe essere "lockato" (es. dalla JVM) o potrebbe essere in una locazione che richiede diritti di amministratore per poter essere modificato (non da uno user normale, "limitato"). E se anche trovassi un modo per aggiornarlo e funzionasse, essendo globale nel jar, i dati non sarebbero certo "per user".
Devi accedere o registrarti per scrivere nel forum
11 risposte