ESP (Emule Switcher Port)

Intro


ESP è un programmino in java che ho scritto per la mia ragazza. Lei vive a Prato ma studia a Pisa. A Prato lei usa le porte standard (4662 per tcp,4672 per udp) mentre a Pisa l'ingegnere informatico della casa ha deciso di usare 4762 e 4772.

Ci si trova quindi nella scomoda situazione di dover cambiare le porte ogni volta che ci si trova in una città diversa e di doversele ricordare o segnare su un fogliettino.

Nasce quindi sto programmino così risolve il problema in poco tempo.

Il programma

Il programma è scritto in java. Fa uso di un file properties strutturato in questa maniera:


# il primo numero è la porta TCP,il secondo la porta UDP
bergamo = 35393,\57264
prato = 4662,\4672
pisa = 4762,\4772

La prima linea è un commento che spiega come sono strutturati i valori delle chiavi. I file properties sono molto utili come files di configurazione per i programmi in java (leggere la documentazione del metodo load per saperne di più).

E' un programma a linea di comando (anche perchè oltre a non esser in grado di fare interfacce grafiche non ne vedo manco la necessità per un'inezia del genere),quindi per rendere la cosa alla portata della mia ragazza,ho creato un file batch con una linea dentro:
@echo off
java -jar esp.jar


Cliccando sul file .bat s'avvierà il programma che chiederà in quale città ci si trovi e riscriverà il file preferences.ini di Emule con le corrette porte. Alla fine chiederà anche se si vuole avviare il mulo.



Nota sulla lettura/scrittura di files


In questo caso si necessitava di editare solo due linee di un file di oltre 300 linee. Siccome in generale le API java mi sembra che permettano solo di scrivere un nuovo file,leggere un file o appendere ad un file esistente nuove linee,ho deciso di immagazzinare ogni linea del file in un ArrayList e modificare le linee che mi interessano quando le incontro,immagazzinando nell'ArrayList le linee modificate.

Alla fine riscrivo il file usando le linee presenti nell'ArrayList:

BufferedReader in = new BufferedReader(new FileReader(pref));
String str;
boolean tcpfound = false;
boolean udpfound = false;
// appena trova la prima occorrenza di port e udpport
// non richiama più il metodo per i lsettaggio della porta
while ((str = in.readLine()) != null) {
if(str.toLowerCase().startsWith("port") && !tcpfound) {
str = esp.setTCPport(prop);
System.out.println(str);
tcpfound = true;
}
if(str.toLowerCase().startsWith("udpport") && !udpfound){
str = esp.setUDPport(prop);
System.out.println(str);
udpfound = true;
}
lines.add(str);
}
in.close();

Qualcuno conosce un metodo più rapido per editare solo delle specifiche linee di un file senza doverselo immagazzinare in una struttura dinamica temporanea per poi riscrivere il file da capo? Mi farebbe piacere sapere cosa fareste voi.



Nota sui files .bat



Sul Pc della mia ragazza i batch files erano associati a Notepad++. come fare per riassociare l'estensione bat agli script per shell? Non è così semplice,perchè Windows XP non mette a disposizione alcun meccanismo grafico per fare ciò (che io sappia).

Windows IT Pro però ci dice i comandi per farlo e han funzionato egregiamente su Windows XP home edition:

ftype batfile="%1" %*
assoc .bat=batfile

Download


Chi volesse scaricare il programma,lo può fare cliccando qui.  Nel file jar è presente anche il sorgente (saprete ovviamente come estrarlo no? :-D ). Un saluto,torniamo alla tesi.

2 comments:

Teo ha detto...

non credo tu possa editare righe dentro un file, ma credo debba ri-crearlo. piuttosto potresti usare lo stesso sitema che hai usato per il file di properties, oppure creare un file xml da memorizzare dentro la home in modo che memorizzi lì le variabili che cambiano (le 2 righe di codice) e con system.get... lo prelevi.

ps: c'è un errore di battitura alla riga 194 ;)

pps: complimenti cmq ;)

Christian ha detto...

@teo: Si un file strutturato come XML o quello di proprietà potrebbe anche andare,ho fatto la prima cosa che mi è venuta in mente :)

Byte Strike Blog - Designed by Posicionamiento Web | Bloggerized by GosuBlogger