Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
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


Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
SpaceX ha confermato che Flight 14 sar&a...
Googlebook pronto al debutto: Google apr...
Guida all'acquisto: quale lavapavimenti ...
Google Maps su Android Auto introduce fi...
AMD Ryzen 5 5500F: fino al 16% di presta...
L'ecosistema partner di Microsoft cresce...
Oracle registra un boom nella divisione ...
Amazon Prime Video sfida TikTok con le n...
L'uscita di Rayman Legends Retold &egrav...
Dazio UE sui pacchi extra UE, in Italia ...
La nuova lavatrice smart di Xiaomi ha tr...
Hai una PSP nel cassetto? Questo nuovo p...
Oracle presenta Java 27 con diverse novi...
Il microscopio dell'EPFL vede più...
Volvo avvia la produzione dei nuovi cami...
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: 00:13.


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