Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi
Con un prezzo di 2.999 euro, il Panasonic Z95BEG entra nella fascia ultra-premium dei TV OLED: pannello Primary RGB Tandem, sistema di raffreddamento ThermalFlow, audio Technics integrato e funzioni gaming avanzate lo pongono come un punto di riferimento
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione
Abbiamo provato per diverse settimane il nuovo Magic V5 di HONOR, uno smartphone pieghevole che ci ha davvero stupito. Il device è il più sottile (solo 4.1mm) ma non gli manca praticamente nulla. Potenza garantita dallo Snapdragon 8 Elite, fotocamere di ottima qualità e batteria in silicio-carbonio che garantisce un'ottima autonomia. E il Prezzo? Vi diciamo tutto nella nostra recensione completa.
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro)
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro)
Google Pixel 10 Pro XL è il top di gamma della serie Pixel, presentando un ampio display Super Actua da 6.8 pollici insieme alle novità della serie, fra cui la ricarica wireless magnetica Pixelsnap e le nuove funzionalità AI avanzate. Il comparto fotografico include un sistema a tripla fotocamera con zoom Pro Res fino a 100x, mentre il processore Tensor G5 con 16GB di RAM garantisce prestazioni percepite molto elevate su Android.
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


Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione HONOR Magic V5: il pieghevole ultra sottile e co...
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro) Recensione Google Pixel 10 Pro XL: uno zoom 100x...
Lenovo IdeaPad Slim 3: un notebook Snapdragon X economico Lenovo IdeaPad Slim 3: un notebook Snapdragon X ...
Recensione OnePlus Watch 3 43mm: lo smartwatch che mancava per i polsi più piccoli Recensione OnePlus Watch 3 43mm: lo smartwatch c...
Il gioco più venduto su Xbox &egr...
Rubati i filmati di oltre 2.000 videocam...
Battlefield 6 sarà molto violento...
Fastweb + Vodafone: arriva la prima offe...
Netflix lancia la possibilità di ...
Digital Foundry elogia il livello tecnic...
Roborock alza l'asticella a IFA 2025: H6...
Instagram: arriva finalmente l'app nativ...
Alpha Trion, Ultra Magnus e Orion Pax: i...
15 anni di Amazon: ecco come ottenere su...
Il nuovo progetto IA di Apple potrebbe e...
La nuova interfaccia di Android non &egr...
Google Pixel: arriva lo streaming audio ...
I nuovi Galaxy Tab S11 sfidano i laptop ...
Samsung lancia Galaxy S25 FE: prezzi e d...
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: 14:04.


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