Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
realme 16 5G è un nuovo smartphone con sensore Sony IMX 852 da 50MP sul retro e uno specchio selfie fisico integrato nella camera bar, una prima nel segmento di mercato. Batteria da 6550mAh in un corpo da 8,1mm e 183g, certificazione IP69K e ricarica da 45W completano un pacchetto aggressivo per la fascia media, per uno dei prodotti più interessanti del produttore sul piano commerciale
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Sono ormai definitive le nuove norme del Codice della Strada per i monopattini elettrici. Non solo targa e assicurazione, le regole sono tante e riguardano diversi aspetti, vi spieghiamo come evitare sanzioni che possono essere salate
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta
DLSS 4.5 introduce Dynamic Multi Frame Generation e MFG 6X, permettendo fino a cinque frame generati per ogni frame renderizzato. I test su Cyberpunk 2077 e 007 First Light mostrano forti incrementi di FPS e riduzione della latenza su RTX 5090 Laptop. Migliorano fluidità, stabilità e qualità visiva.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-12-2002, 15:20   #1
Vegale
Senior Member
 
Iscritto dal: Feb 2000
Messaggi: 113
Java e file di testo

Dispongo di un file di testo contenenti frasi varie. Il mio progamma ne dovrebbe leggerne una a caso e stamparla. Vorrei conoscere il metodo più pratico per effettuare questa cosa, dato che mi sto scervellando! Per ora son riuscito a caprire come leggere un file di testo in maniera sequenziale, con la classe BufferedReader.
Inoltre, vorrei che il Math.random fosse fatto tenendo conto di tutti gli elementi del file, ma come faccio a sapere quanti elementi (per esempio, quante righe) ci sono nel suddetto file?
Domanda curiosa...
Vegale è offline   Rispondi citando il messaggio o parte di esso
Old 17-12-2002, 12:39   #2
PGI
Bannato
 
L'Avatar di PGI
 
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
Se vuoi sapere il numero di linee contenute in un file di testo puoi usare un ciclo tipo questo su un oggetto LineNumberReader

Codice:
        while(!eof) {
          if(lineReader.readLine()==null)
            eof=true;
        }
Al termine del ciclo il metodo "getLineNumber()" di LineNumberReader restituisce un "int" il cui valore è l'indice dell'ultima riga letta (cioè il numero totale di righe a partire dalla linea zero).

Lo stesso LineNumberReader ti permette poi di spostarti tra le linee di testo con il metodo "setLineNumber(int indice)": la chiamata successiva del metodo "readLine()" leggerà la linea all'indice scelto.

Potresti anche "infilare" le linee file di testo in un Vector all'inizio del programma per evitare un continuo accesso al disco fisso, ma questo dipende anche dal numero di "frasi" da leggere.

Ciao.
PGI è offline   Rispondi citando il messaggio o parte di esso
Old 17-12-2002, 23:12   #3
Vegale
Senior Member
 
Iscritto dal: Feb 2000
Messaggi: 113
Quote:
Originally posted by "PGI"

Se vuoi sapere il numero di linee contenute in un file di testo puoi usare un ciclo tipo questo su un oggetto LineNumberReader

Codice:
        while(!eof) {
          if(lineReader.readLine()==null)
            eof=true;
        }
Al termine del ciclo il metodo "getLineNumber()" di LineNumberReader restituisce un "int" il cui valore è l'indice dell'ultima riga letta (cioè il numero totale di righe a partire dalla linea zero).

Lo stesso LineNumberReader ti permette poi di spostarti tra le linee di testo con il metodo "setLineNumber(int indice)": la chiamata successiva del metodo "readLine()" leggerà la linea all'indice scelto.

Potresti anche "infilare" le linee file di testo in un Vector all'inizio del programma per evitare un continuo accesso al disco fisso, ma questo dipende anche dal numero di "frasi" da leggere.

Ciao.
Difatti, avevo pensato ad un Vector, ma mi pareva troppo impegnativo caricare tutte le frasi in memoria, che possono tra l'altro essere parecchie, per poi leggerne solo una.. Tra il Vector e quello che dici tu, quale può garantire migliori prestazioni?
La classe LineNumberReader l'ho conosciuta poco fa e mi pare interessante.. Vedrò cosa posso fare con i tui consigli.. Grazie per ora. Ciao
Vegale è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2002, 19:04   #4
Vegale
Senior Member
 
Iscritto dal: Feb 2000
Messaggi: 113
Hmmm..

Purtroppo il metodo setLineNumber a cui ti riferisci non funziona come si deve. Infatti, nella classe LineNumberReader, tra le info ho trovato questo:

* Note however, that <CODE>setLineNumber(int)</CODE> does not actually change the current
* position in the stream; it only changes the value that will be returned
* by <CODE>getLineNumber()</CODE>.

Non cambia la posizione nello stream, quindi non mi serve molto..
E se facessi tanti readLine() finché non mi trovo alla riga che voglio? Fa schifo?
Vegale è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2002, 19:23   #5
Vegale
Senior Member
 
Iscritto dal: Feb 2000
Messaggi: 113
Altro problema e poi basta..
una volta fatto il ciclo per trovare il getLineNumber, mi trovo alla fine del file. Per ritornare in cima, devo riaprire il file o c'è un altor metodo? Troppi accessi al disco fisso? ;_;
Vegale è offline   Rispondi citando il messaggio o parte di esso
Old 18-12-2002, 21:08   #6
PGI
Bannato
 
L'Avatar di PGI
 
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
Dopo l'ultimo (utilissimo ) consiglio che ti ho dato, stavolta ho prima provato e poi postato!

L'utilità dei metodi setLineNumber() e getLineNumber() generosamente forniti da Sun mi sfugge, visto che non fanno una mazza .

Puoi evitare di riaprire il file "marcando" il buffer con il metodo mark(int size) all'apertura del file e richiamare il metodo reset() quando vuoi tornare all'inizio.

Visto però che la classe LineNumberReader contiene due metodi (i famigerati setLineNumber() e getLineNumber()) praticamente vuoti, tanto vale crearsi un proprio LineNumberReader estendendo quello di Sun "sovrascrivendo quà e là"

Per il metodo setLineNumber() anche a me l'unica soluzione sembra un ciclo (io ho provato un "for").

Ti scrivo una classe di esempio:

Codice:
public class MyLineReader extends LineNumberReader{

  public MyLineReader(Reader reader, int readAhead) throws IOException{
    super(reader);
    mark(readAhead);
  }

  public void setLineNumber(int lineNum) {
    super.setLineNumber(lineNum);
    try {
      reset();
      for(int i=0;i<lineNum;i++) {
        readLine();
      }
    } catch (IOException ex) {
      System.err.println("Error while setting line");
      System.out.println(ex);
    }
  }
}
Per quanto riguarda la dimensione da passare al metodo mark(int) io l'ho ottenuta passando per un FileInputStream() così:

FileInputStream inFile=new FileInputStream(file);
InputStreamReader inReader=new InputStreamReader(inFile);
MyLineReader lineReader=new MyLineReader(inReader,inFile.available()*2);

In Java un char occupa due byte, ecco perchè la "dimensione" del buffer è ottenuta moltiplicando per 2 il valore (in byte) della dimensione del "FileInputStream".

A questo punto i metodi "reset()" e "setLineNumber(int)" fanno quello che dovrebbero fare .

Usare un Vector (o un array) per immagazzinare i dati all'inizio del programma dovrebbe evitarti la scrittura di un tuo reader; tieni anche conto del fatto che anche se un Vector occupa un po' memoria, dal punto di vista delle prestazioni il sacrificio è più che accettabile, sia perchè un sistema medio possiede memoria a sufficienza per "stoccare" anche una serie molto lunga di stringhe (e meno che tu non voglia infilargli dentro l'enciclopedia britannica ), sia perchè ne beneficia la facilità di lettura del codice.

Se hai bisogno sono qui (magari arrivo un po' tardi, ma arrivo )

Ciao.
PGI è offline   Rispondi citando il messaggio o parte di esso
Old 19-12-2002, 09:25   #7
cn73
Senior Member
 
L'Avatar di cn73
 
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
Codice:
public String getBuffer() throws Exception{
  try
    {
      File fileInst = new File(nomeFile);
      FileReader file = new FileReader(nomeFile);
      char[] c = new char[(int)fileInst.length()];
      file.read(c);
      String buffer = String.copyValueOf(c);
      file.close();
      
      
      return buffer;
    }
    catch(Exception ex)
    {
       System.err.println("Exception raised by <getBuffer>: "+ex);
       throw ex;
    }
  }
Questo metodi ti ritorna una stringa, sulla quale puoi operare con accesso diretto e non sequenziale, tramite i metodi substring() e similari...
cn73 è offline   Rispondi citando il messaggio o parte di esso
Old 19-12-2002, 16:20   #8
Vegale
Senior Member
 
Iscritto dal: Feb 2000
Messaggi: 113
Grazie per le risposte
Hmm.. se dici che l'utilizzo di un vettore rimane comunque una scelta da considerare, posso provare con quello, benché sia riuscito alla fine a fare ciò che volevo fare leggendo dal file (con molta fatica!). Anche perché, una volta creato il vettore, posso utilizzare quello invece che riaprire nuovamente il file.

boh.. vediamo un po'.. mi rifarò risentire..
Vegale è offline   Rispondi citando il messaggio o parte di esso
Old 22-12-2002, 00:22   #9
Vegale
Senior Member
 
Iscritto dal: Feb 2000
Messaggi: 113
Arieccomi.. :D

Ok.. il programma mi gira sotto, diciamo "dos", invece provando a creare una applet mi dà il seguente errore:
caricamento: impossibile definire istanze per Prova.class.
java.lang.InstantiationException: Prova

E pochi minuti prima girava sotto console! Mah..
Il problema è dato dal costruttore di oggetti, che mi serve per infilare le righe dentro il vettore, in modo da poterle rileggere successivamente.

Qualche idea?
Vegale è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh Recensione realme 16 5G: lo smartphone con Selfi...
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni Come rispettare tutte le nuove regole per i mono...
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta DLSS 4.5: con Dynamic Frame Generation e MFG 6X ...
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere) Plaud NotePin S, il registratore IA si fa indoss...
Redmi Watch 6 in prova: lo smartwatch con ampio display da 2000 nit a meno di 100 euro Redmi Watch 6 in prova: lo smartwatch con ampio ...
La NASA sta provando il Divergent Deploy...
Fidanzarsi con l'IA non è cos&igr...
AI Overviews: quando il riassunto &egrav...
Il circuito segreto di Apple finisce a W...
Disastro Meta: l'azienda elimina il rico...
Google Gemini non va: centinaia di segna...
Neural Dawn mostra il futuro del gaming ...
Telegram torna su Apple Watch con un'app...
Da oggi si può acquistare Amazon ...
Windows 11 è più veloce: implementati il...
Ritornano gli auricolari con il cavo: Te...
Insta360 Luna Ultra: ecco il debutto del...
BOOX Go 6 Gen II ufficiale: ora si scriv...
BYD sfida Tesla con un piano da 2 miliar...
La corsa ai datacenter passa dalla stamp...
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: 21:44.


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