View Full Version : Lettura scrittura file con java
Abdujaparov
03-09-2005, 17:31
Salve a tutti ho provato a scrivere una classe che mi permette di leggere e memorizzare alcune stringhe in un file.
Il file su cui opero si chiama infor.txt ed è nella directory file mentre la classe java che lo utilizza è nel package codice. Sia file che codice sono nella stessa cartella.
Il file infor.txt deve ed è organizzato in questo modo:
server: //qua c'è del testo
porta: //qua c'è del testo
database: //qua c'è del testo
user: //qua c'è del testo
password: //qua c'è del testo
La classe che ho scritto è questa:
package codice;
import java.io.*;
import javax.swing.JOptionPane;
public class LeggiScriviDati {
private FileReader filer;
private FileWriter filew;
public LeggiScriviDati() {
super();
try{
FileReader filer = new FileReader("..\\file\\infor.txt");
FileWriter filew = new FileWriter("..\\file\\infor.txt");
}catch(Exception e){JOptionPane.showMessageDialog(null, "File non trovato.", "Errore file", JOptionPane.ERROR_MESSAGE);}
}
public String[] getParametri(){
String[] parametri = new String[5];
try{
BufferedReader in = new BufferedReader(filer);
while (in.ready()){
String buffer = in.readLine();
if ((buffer.indexOf("server:")) >=0)
parametri[0]=buffer.substring(buffer.indexOf(":")+1);
else if((buffer.indexOf("porta:")) >=0)
parametri[1]=buffer.substring(buffer.indexOf(":")+1);
else if((buffer.indexOf("database:")) >=0)
parametri[2]=buffer.substring(buffer.indexOf(":")+1);
else if((buffer.indexOf("user:")) >=0)
parametri[3]=buffer.substring(buffer.indexOf(":")+1);
else if((buffer.indexOf("password:")) >=0)
parametri[4]=buffer.substring(buffer.indexOf(":")+1);
in.close();
}
}catch(IOException e){JOptionPane.showMessageDialog(null, "Errore memorizzazione dati.", "Errore", JOptionPane.ERROR_MESSAGE);;}
return parametri;
}
public void setParametri(String[] parametri){
try{
BufferedReader in = new BufferedReader(filer);
PrintWriter out = new PrintWriter (filew);
while (in.ready()){
String buffer = in.readLine();
if ((buffer.indexOf("server:")) >=0)
out.print (buffer+parametri[0]);
else if((buffer.indexOf("porta:")) >=0)
out.print(buffer+parametri[1]);
else if((buffer.indexOf("database:")) >=0)
out.print(buffer+parametri[2]);
else if((buffer.indexOf("user:")) >=0)
out.print(buffer+parametri[3]);
else if((buffer.indexOf("password:")) >=0)
out.print(buffer+parametri[4]);
out.flush();
in.close();
out.close();
}
}catch(IOException e){JOptionPane.showMessageDialog(null, "Errore memorizzazione dati.", "Errore", JOptionPane.ERROR_MESSAGE);;}
}
}
//fine classe
Questo è il piccolo main che ho scritto per provare la classe:
public static void main(String[] args) {
LeggiScriviDati lsd = new LeggiScriviDati();
String[] parametri = new String[5];
parametri[0]="192.168.0.16";
parametri[1]="3306";
parametri[2]="tesi";
parametri[3]="tesi";
parametri[4]="juventus";
lsd.setParametri(parametri);
}
}
Qua sorgono i problemi, la classe mi viene compilata correttamente però se faccio partire il main mi viene subito data un'eccezione quando inzializzo la classe infatti mi compare la finestrella che dice file non trovato.
A cosa è dovuto il problema? Dove sbaglio? Il percorso del file mi sembra di averlo scritto correttamente e se metto il file nella stessa cartella del file class mi viene dato sempre lo stesso errore, che devo fare?
Ah un'ultima cosa c'è un metodo della classe String che permette di eliminare tutti gli spazi da una stringa?
Grazie a tutti, ciao ciao.
c'e' qualche piccolo errore sintattico nel file che hai postato, in ogni caso l'eccezione ti viene lanciata nel costruttore perchè il file che vuoi aprire in lettura non esiste.
franksisca
03-09-2005, 22:28
FileReader filer = new FileReader("..\\file\\infor.txt");
FileWriter filew = new FileWriter("..\\file\\infor.txt");
i percorsi dei file in java si passano così:
String percorso="c:/percorso/nome_file.estensione";
e poi controlla che il file ci sia, e se non c'è, crealo.
Questo ti consiglio di farlo facendo così:
Cattura una FileNotFoundException, e nel cetch crea il file, in modo che pure che non c'è, il file lo crei e poi puoi salvarci.
Abdujaparov
04-09-2005, 08:37
Allora il file c'è sicuramente e provando a inserire il file nella cartella del class e modificando così il costruttore il file viene trovato.
Costruttore:
public LeggiScriviDati() {
try{
filer = new FileReader("infor.txt");
filew = new FileWriter("infor.txt");
}catch(IOException e){JOptionPane.showMessageDialog(null, e.getMessage(), "Errore file", JOptionPane.ERROR_MESSAGE);}
}
Ora per quanto riguarda i percorsi mi sembra di ricordare che i percorsi relativi e non assoluti si possano inserire, mi sembra di averlo visto non vorrei sbagliare.
Il percorso c:\ecc ecc è un percorso assoluto ma se un utente decide di mettere il programma in d:\pippo dovrebbe dare problemi ed a me serve che il programma parta sia in c: che in d:.
Poi un altro problema.
Provo a richiamare il metodo (mettendo il file nella stessa cartella del class):
public void setParametri(String[] parametri){
try{
BufferedReader in = new BufferedReader(filer);
PrintWriter out = new PrintWriter (filew);
while (in.ready()){
String buffer = in.readLine();
System.out.println("riga trovata:"+buffer);
if ((buffer.indexOf("server:")) >=0)
out.print (buffer+parametri[0]);
else if((buffer.indexOf("porta:")) >=0)
out.print(buffer+parametri[1]);
else if((buffer.indexOf("database:")) >=0)
out.print(buffer+parametri[2]);
else if((buffer.indexOf("user:")) >=0)
out.print(buffer+parametri[3]);
else if((buffer.indexOf("password:")) >=0)
out.print(buffer+parametri[4]);
out.flush();
in.close();
out.close();
}
}catch(IOException e){
JOptionPane.showMessageDialog(null, "Errore memorizzazione dati.", "Errore", JOptionPane.ERROR_MESSAGE);
}
}
Il metodo dovrebbe inserire i parametri passati nel file ma invece non fa nulla e quello che mi lascia un pò stupito è che la riga:
System.out.println("riga trovata:"+buffer);
Non viene mai stampata, come se nel file non ci fosse nulla e in.ready() sia false, dove in è:
BufferedReader in = new BufferedReader(filer);
A cosa può essere dovuto questo comportamento?
Grazie a tutti, ciao ciao.
franksisca
04-09-2005, 09:50
Scusa, magari non c'entra niente, ma io farei così:
boolean more=true;
String buffer="";
while(more){
String dato=in.readLine();
if(dato==null){
more=false
break;
}
else
buffer+=dato;
//e poi continuo con il resto del codi
e vedi quello che succede.
Inutile chiederti se il vettore di parametri che gli passi è pieno, vero??? :stordita:
ABCcletta
04-09-2005, 16:57
Invece di FileReader e FileWriter utilizza gli stream.
FileInputStream fis = new FileInputStream(new File("path_del_file"));
DataInputStream dis = new DataInputStream(fis);
FileOutputStream fos = new FileOutputStream(new File("path_del_file"));
PrintStream ps = new PrintStream(fis);
per leggere una riga da file utilizzi:
dis.readLine();
per scrivere una riga su file utilizzi:
ps.println();
Quando finisci, ricorda di chiudere gli stream col metodo .close()
Abdujaparov
05-09-2005, 20:42
Ho provato a seguire il tuo consiglio però dalle api leggo che il metodo readLine() di DataInputStream è deprecatoe mi viene detto di sostituirlo nel seguente modo:
DataInputStream d = new DataInputStream(in);
with:
BufferedReader d
= new BufferedReader(new InputStreamReader(in));
Seguendo le indicazioni ho modificato così il codice, per adesso ho provato solo la lettura ed ecco il codice:
public LeggiScriviDati() {
try{
file = new File("infor.txt");
//filer = new FileReader(file);
//filew = new FileWriter(file);
fis = new FileInputStream(file);
//dis = new DataInputStream(fis);
fos = new FileOutputStream(file);
//ps = new PrintStream(fos);
}catch(IOException e){JOptionPane.showMessageDialog(null, e.getMessage(), "Errore file", JOptionPane.ERROR_MESSAGE);}
}
public String[] getParametri(){
String[] parametri = new String[5];
System.out.println("Entro nel metodo get");
try{
BufferedReader in = new BufferedReader(new InputStreamReader(fis));
System.out.println("condizione d'ingresso:"+(in.ready()));
while (in.ready()){
String buffer = in.readLine();
System.out.println("riga trovata:"+buffer);
if ((buffer.indexOf("server:")) >=0)
parametri[0]=buffer.substring(buffer.indexOf(":")+1);
else if((buffer.indexOf("porta:")) >=0)
parametri[1]=buffer.substring(buffer.indexOf(":")+1);
else if((buffer.indexOf("database:")) >=0)
parametri[2]=buffer.substring(buffer.indexOf(":")+1);
else if((buffer.indexOf("user:")) >=0)
parametri[3]=buffer.substring(buffer.indexOf(":")+1);
else if((buffer.indexOf("password:")) >=0)
parametri[4]=buffer.substring(buffer.indexOf(":")+1);
in.close();
}
}catch(IOException e){JOptionPane.showMessageDialog(null, "Errore memorizzazione dati.", "Errore", JOptionPane.ERROR_MESSAGE);;}
return parametri;
}
Se richiamo il metodo getParametri ottengo che vengono stampate le stringhe:
"Entro nel metodo get"
e la stringa che mi stampa la condizione del ciclo while:
"condizione d'ingresso:"+(in.ready())
questa condizione è false e non capisco il perchè, il file contiene delle stringhe perchè questa condizione è false?
L'array che passavo prima, per rispondere a franksisca non era vuoto ma conteneva delle stringhe queste per la precisione:
String[] parametri = new String[5];
parametri[0]="192.168.0.16";
parametri[1]="3306";
parametri[2]="tesi";
parametri[3]="tesi";
parametri[4]="juventus";
Come posso fare? Devo per forza poter scrivere su file, vi prego aiutatemi.
Ho provato anche a mettere true come condizione del ciclo while però in.readLine() mi ritorna null.
Grazie, ciao ciao.
ABCcletta
05-09-2005, 21:09
Scusa, ho sbagliato. Il metodo esatto da usare quando usi un DataInputStream è readUTF().
Comunque va benissimo il BufferedInputStream in modo da fare lettura bufferizzata.
Il mio consiglio è quello di cambiare il ciclo.
Direi che puoi effettuare una cosa del genere:
String temp = null;
while( (temp=in.readLine()) != null ) {
}
In questo modo quando non viene letto nulla dal file si esce dal ciclo direttamente...
Abdujaparov
05-09-2005, 22:58
Il problema è proprio questo la condizione che uso io verifica se c'è ancora qualcosa nel file se trova null esce dal ciclo solo che questa condizione è automaticamente false. Ho provato ad eliminare la condizione e ad impostarla a true per vedere cosa prendeva dal file di testo però prende null come parametro è mi lancia un'eccezione appena prende null. Il problema è che non legge assolutamente nulla dal file ed il file non è vuoto perchè contiene questo:
server:
porta:
database:
user:
password:
Come posso fare per fargli leggere da file?
Grazie ancora per la pazienza.
Ciao ciao.
ABCcletta
05-09-2005, 23:02
Il problema è proprio questo la condizione che uso io verifica se c'è ancora qualcosa nel file se trova null esce dal ciclo solo che questa condizione è automaticamente false. Ho provato ad eliminare la condizione e ad impostarla a true per vedere cosa prendeva dal file di testo però prende null come parametro è mi lancia un'eccezione appena prende null. Il problema è che non legge assolutamente nulla dal file ed il file non è vuoto perchè contiene questo:
server:
porta:
database:
user:
password:
Come posso fare per fargli leggere da file?
Grazie ancora per la pazienza.
Ciao ciao.
Allora, innanzitutto, ti RIconsiglio di utilizzare il while come te l'ho postato più su. Poi, ho un dubbio. Hai inserito il file nella cartella giusta? Potrebbe essere che stai sbagliando cartella, a quel punto l'istruzione <File f = new File("xxx.xxx")> creerebbe un file nuovo ma vuoto, da qui, il null...
Scusa se non ti dico niente sul tuo codice, mi sembrava un po' lungo da leggere e non ho molto tempo.
Ti posto il codice che uso io per leggere un file di configurazione semplice, formato da commenti (iniziano con #).
La parte che ti può essere utile è
this.getClass().getResourceAsStream(configFile)
con la quale ottieni un inputStream del file indicato come percorso relativo a partire da dove si trova la classe che contiene il codice in questione.
Config è un bean a parte per gestire la configurazione.
private Config readConfiguration (String configFile) throws Exception
{
InputStream is = this.getClass().getResourceAsStream(configFile);
BufferedReader in = new BufferedReader(new InputStreamReader(is));
Config config = new Config();
while (true)
{
String linea = in.readLine();
if (linea==null) break;
else
{
linea = linea.trim();
if (!linea.startsWith("#")) // Salto i commenti
{
if (linea.startsWith("server: ")) config.setServer(linea.substring("server:".length()));
if (linea.startsWith("port: ")) config.setPort(linea.substring("port:".length()));
// ecc. per tutte le configurazioni
}
}
}
in.close();
is.close();
return config;
}
Abdujaparov
06-09-2005, 16:24
Finalmente sono riuscito a leggere dal file evvia!
Ho utilizzato il codice postato da pinok scrivendolo in questo modo:
private String configFile;
public ProvaLettura() {
configFile = "..\\file\\promo.txt";
}
public String[] readConfiguration () throws Exception
{
InputStream is = this.getClass().getResourceAsStream(configFile);
BufferedReader in = new BufferedReader(new InputStreamReader(is));
String[] config = new String[5];
while (true)
{
String linea = in.readLine();
if (linea==null) break;
else
{
linea = linea.trim();
if (!linea.startsWith("//")) // Salto i commenti
{
if (linea.startsWith("server: "))
config[0]=linea.substring("server:".length()).trim();
if (linea.startsWith("port: "))
config[1]=linea.substring("port:".length()).trim();
if (linea.startsWith("database: "))
config[2]=linea.substring("database:".length()).trim();
if (linea.startsWith("utente: "))
config[3]=linea.substring("utente:".length()).trim();
if (linea.startsWith("password: "))
config[4]=linea.substring("password:".length()).trim();
}
}
}
in.close();
is.close();
return config;
}
La lettura funziona anche inserendo il path relativo del file, ringrazio tutti ora provo a scrivere nel file, in pratica devo creare un metodo che sostituisca, nel file letto in precedenza, nuovi parametri a quelli prima ottenuti.
Grazie a tutti, ciao ciao.
texerasmo
06-09-2005, 16:39
Perchè non provi ad usare i file properties?
forse è meglio per il tuo caso
[CODE]
public class Sneto2 {
/*
Creo il metodo getParamConnection
questo metodo legge e memorizza le chiavi valori del file miofile.properties
param filename dico quale file deve andardi a leggere
@return un Hashtable contente le chiavi valori
*/
public Hashtable getParamConnection(String filename) throws IOException {
//Definisco Hashtable
Hashtable listconn = new Hashtable();
try{
//Gli passo il file da andare a leggere
InputStream is = this.getClass().getResourceAsStream(filename);
PropertyResourceBundle propertyresourcebundle = new PropertyResourceBundle(is);
is.close();
Enumeration enum = propertyresourcebundle.getKeys();
while (enum.hasMoreElements()){
System.out.println("Inizio");
String app_chiave = (String)enum.nextElement();
System.out.println("Chiave= " + app_chiave);
String app_valore = propertyresourcebundle.getString(app_chiave);
app_valore= app_valore.trim();
System.out.println("Valore= "+propertyresourcebundle.getString(app_chiave));
System.out.println("Fine*************");
System.out.println(" ");
listconn.put(app_chiave,app_valore);
}
}catch(Exception ex){
ex.printStackTrace();
}finally {
}
return listconn;
}
[CODE]
un file properties è fatto in questo modo
server=22.22.22
porta = 8080
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.