Esistono diversi modi per specificare i percorsi, già tutti illustrati diverse volte su altre discussioni.
Si può, ad esempio, utilizzare un file di configurazione rintracciabile in una posizione nota all'applicazione (una sua sottocartella, un percorso "famoso", un percorso mappato in una variabile d'ambiente [da configurare], ecc); all'interno di questo file di configurazione si andranno a scrivere i percorsi importanti per l'applicazione... ovviamente, all'installazione dell'applicazione verrà modificato coerentemente questo file di configurazione. Questa tecnica è efficace per percorsi che sono di interesse solo per l'applicazione (come la posizione di altri programmi da sfruttare, o di file di configurazione di particolari moduli dell'applicazione, ecc).
Si può, in alternativa, far scegliere all'utente il percorso in cui leggere/scrivere, tramite l'uso di un JFileChooser, che aprirà all'utente la classica finestra di ricerca. Questo metodo è comodo per i file dell'utente (prodotti o usati dall'applicazione), che quindi l'utente si aspetta di trovare nel posto in cui lui decide di salvarli.
Io di solito, per i file di "configurazione" predispongo una cartella "config" allo stesso livello dell'applicazione (quindi, allo stesso livello del file JAR) e lì dentro ci metto quel che mi serve. Quindi, configurando opportunamente (tramite collegamento) l'avvio dell'applicazione, sono certo che la working-directory sia esattamente la directory dell'applicazione e sfrutto i percorsi relativi:
codice:
FileInputStream fis = new FileInputStream("config/file.cfg");
// Leggo il "file.cfg" e recupero lì dentro i percorsi che mi servono
...
In alternativa c'è il modo di risalire alla directory che contiene il JAR che è stato avviato (a patto di conoscere il nome del JAR):
codice:
private String getMyPath() {
// NomeClasse è il nome della classe che si sta eseguendo
String str = NomeClasse.class.getResource("NomeClasse.class").toExternalForm();
String nomeJAR = ... // Nome del JAR
int start = 0;
int end = str.indexOf( nomeJAR );
if ( str.startsWith("jar:") ) {
start = 4;
}
if (str.indexOf("file:/") >= 0) {
start += 6;
}
str = str.substring(start, end);
str = str.replaceAll("%20", " ");
return str;
}
Ciao.