Torna indietro   Hardware Upgrade Forum > Software > Programmazione

ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità
ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità
NUC 15 Pro e NUC 15 Pro+ sono i due nuovi mini-PC di casa ASUS pensati per uffici e piccole medie imprese. Compatti, potenti e pieni di porte per la massima flessibilità, le due proposte rispondono in pieno alle esigenze attuali e future grazie a una CPU con grafica integrata, accompagnata da una NPU per la gestione di alcuni compiti AI in locale.
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint
Dal palco di Proofpoint Protect 2025 emerge la strategia per estendere la protezione dagli utenti agli agenti IA con il lancio di Satori Agents, nuove soluzioni di governance dei dati e partnership rafforzate che ridisegnano il panorama della cybersecurity
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Dopo alcuni anni di assenza dai cataloghi dei suoi televisori, Hisense riporta sul mercato una proposta OLED che punta tutto sul rapporto qualità prezzo. Hisense 55A85N è un televisore completo e versatile che riesce a convincere anche senza raggiungere le vette di televisori di altra fascia (e altro prezzo)
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 03-09-2005, 17:31   #1
Abdujaparov
Senior Member
 
Iscritto dal: Aug 2004
Città: Palermo
Messaggi: 1079
Lettura scrittura file con java

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.

Ultima modifica di Abdujaparov : 03-09-2005 alle 17:31. Motivo: titolo incompleto
Abdujaparov è offline   Rispondi citando il messaggio o parte di esso
Old 03-09-2005, 21:13   #2
kingv
Senior Member
 
L'Avatar di kingv
 
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
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.
kingv è offline   Rispondi citando il messaggio o parte di esso
Old 03-09-2005, 22:28   #3
franksisca
Senior Member
 
L'Avatar di franksisca
 
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
Quote:
Originariamente inviato da Abdujaparov
FileReader filer = new FileReader("..\\file\\infor.txt");
FileWriter filew = new FileWriter("..\\file\\infor.txt");
i percorsi dei file in java si passano così:
Codice:
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.
__________________
My gaming placement
franksisca è offline   Rispondi citando il messaggio o parte di esso
Old 04-09-2005, 08:37   #4
Abdujaparov
Senior Member
 
Iscritto dal: Aug 2004
Città: Palermo
Messaggi: 1079
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.
Abdujaparov è offline   Rispondi citando il messaggio o parte di esso
Old 04-09-2005, 09:50   #5
franksisca
Senior Member
 
L'Avatar di franksisca
 
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
Scusa, magari non c'entra niente, ma io farei così:
Codice:
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???
__________________
My gaming placement

Ultima modifica di franksisca : 04-09-2005 alle 09:51. Motivo: mi ero dimentiocato il break;
franksisca è offline   Rispondi citando il messaggio o parte di esso
Old 04-09-2005, 16:57   #6
ABCcletta
Senior Member
 
L'Avatar di ABCcletta
 
Iscritto dal: Sep 2004
Città: Ovunque
Messaggi: 5804
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()
ABCcletta è offline   Rispondi citando il messaggio o parte di esso
Old 05-09-2005, 20:42   #7
Abdujaparov
Senior Member
 
Iscritto dal: Aug 2004
Città: Palermo
Messaggi: 1079
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.

Ultima modifica di Abdujaparov : 05-09-2005 alle 20:47.
Abdujaparov è offline   Rispondi citando il messaggio o parte di esso
Old 05-09-2005, 21:09   #8
ABCcletta
Senior Member
 
L'Avatar di ABCcletta
 
Iscritto dal: Sep 2004
Città: Ovunque
Messaggi: 5804
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...
ABCcletta è offline   Rispondi citando il messaggio o parte di esso
Old 05-09-2005, 22:58   #9
Abdujaparov
Senior Member
 
Iscritto dal: Aug 2004
Città: Palermo
Messaggi: 1079
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.
Abdujaparov è offline   Rispondi citando il messaggio o parte di esso
Old 05-09-2005, 23:02   #10
ABCcletta
Senior Member
 
L'Avatar di ABCcletta
 
Iscritto dal: Sep 2004
Città: Ovunque
Messaggi: 5804
Quote:
Originariamente inviato da Abdujaparov
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...
ABCcletta è offline   Rispondi citando il messaggio o parte di esso
Old 06-09-2005, 01:36   #11
pinok
Senior Member
 
Iscritto dal: Jun 2001
Città: Alessandria (provincia)
Messaggi: 4772
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.

Codice:
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;
}

Ultima modifica di pinok : 06-09-2005 alle 01:41.
pinok è offline   Rispondi citando il messaggio o parte di esso
Old 06-09-2005, 16:24   #12
Abdujaparov
Senior Member
 
Iscritto dal: Aug 2004
Città: Palermo
Messaggi: 1079
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.
Abdujaparov è offline   Rispondi citando il messaggio o parte di esso
Old 06-09-2005, 16:39   #13
texerasmo
Senior Member
 
Iscritto dal: Feb 2003
Città: Formia
Messaggi: 1545
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
texerasmo è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondo...
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint Cybersecurity: email, utenti e agenti IA, la nuo...
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti Hisense A85N: il ritorno all’OLED è convi...
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento Acer TravelMate P6 14 AI: il Copilot+ PC sotto i...
Recensione Borderlands 4, tra divertimento e problemi tecnici Recensione Borderlands 4, tra divertimento e pro...
Fire TV Stick HD, 4K e 4K Max: streaming...
Echo Dot, Echo Show ed Echo Spot in offe...
Kindle Colorsoft e Scribe in offerta: co...
Disney diffida Character.AI: stop all'us...
ASUS ROG aggiorna la sua gamma: arrivano...
Avalanche Studios, la software house che...
Tante novità in arrivo per OnePlu...
Novità per la smarthome da EZVIZ....
Intel SGX e AMD SEV-SNP aggirabili su pi...
Autovelox, parte il censimento ufficiale...
Adobe Premiere arriva su iPhone: l'app &...
Il Cybertruck di Tesla non può es...
Windows 11 25H2 è stato appena ri...
VMware, con la versione 9 di Cloud Found...
Area B e C Milano, stop alle auto benzin...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 13:20.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v