Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Marcature?

  1. #1

    Marcature?

    Da tempo mi è stato detto che per evitare di leggere più volte un file si possono utilizzare le marcature, solo che non sono mai riuscito a farlo.
    Se per esempio avessi un esercizio dove mi si chiede di leggere il file di input che non è altro che una pagina di un libro, e bisogna stamparlo scritto al contrario, cioè invertendo la prima con l'ultima riga e così via, io avevo in passato fatto la prima lettura per sapere quante righe ci sono nel file, e poi inserito in un array le varie righe.
    Come si utilizzano le marcature?
    Ho letto che c'è il metodo:

    codice:
    public void mark(int readAheadLimit)
              throws IOException
    Dove come parametro bisogna passare se non ho capito male il numero di caratteri che potrebbero essere letti.

    Però non mi è chiaro come fare a sapere quanti siano i caratteri, e come usare la chiamata reset per fare partire dall'inizio del file la lettura.
    Mi chiarireste queste cose?

    Grazie.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Marcature?

    Originariamente inviato da Darèios89
    Come si utilizzano le marcature?
    Innanzitutto una classe di input potrebbe non supportare le marcature, c'è comunque il metodo markSupported() che indica se la classe supporta mark/reset.


    Originariamente inviato da Darèios89
    Ho letto che c'è il metodo:

    codice:
    public void mark(int readAheadLimit)
              throws IOException
    Dove come parametro bisogna passare se non ho capito male il numero di caratteri che potrebbero essere letti.
    No, facciamo chiarezza. Quando invochi mark lui memorizza la posizione "corrente" a cui puoi tornare indietro facendo un reset().

    Il "read limit" non indica quanti byte "potrebbero essere letti" (che non vuol dire granché), ma quanti byte si possono leggere prima che la posizione marcata diventi invalida.

    Se invoco unStream.mark(1000); vuol dire da quel punto corrente (ora "marcato") posso leggere altri 1000 byte stando sicuro che la marcatura resta valida. Leggendo oltre il millesimo byte, la marcatura diventa invalida e non si può più usare reset().

    Generalmente questo modo di gestire la marcatura presuppone la allocazione e la presenza di un "buffer", appunto per poter rileggere dei byte indietro.
    Questo è il motivo per cui ad esempio FileInputStream non supporta il mark (non ha "buffer") mentre BufferedInputStream lo supporta appunto perché prevede una bufferizzazione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Mh....

    Ho provato a fare un esercizio che ho scritto sopra, ho scritto il codice adesso, non ho ben visto se ci sono errori di logica, ora controllo ma intanto posto ciò che ho scritto.
    Il problema è che vorrei risolverlo inserendo le righe in un array, e stamparlo su file al contrario, così da avere le stringhe al contrario.
    Il problema è che dovrei fare una prima lettura per sapere quante righe ho, e un' altra per memorizzare, il che dovrebbe essere completamente inefficiente.
    Ho provato ad usare le marcature ma ho un errore.

    codice:
    import java.util.io.*;
    
    public class Invertirelerighe
    {
    	public static void main(String [] args) throws IOException
    	{
    		FileReader reader=null;
    		BufferedReader buff=null;
    		PrintWriter out=null;
    		
    		try
    		{
    			reader=new FileReader("input.txt");
    			buff=new BufferedReader(reader);
    			out=new PrintWriter("output.txt");
    			
    			buff.mark(int 1000);
    			
    			int righe=0;
    			
    				while(buff.ready())
    					righe++;
    			
    			String [] frasi=new String[righe];
    			
    			buff.reset();
    				
    				int i=0;
    				
    				while(buff.ready())
    				
    					frasi[i++]=buff.ReadLine();
    				
    				for(int i=frasi.length-1; i>=0; i--)
    				
    					out.print(frasi[i]+"\r"+"\n");
    		}
    		
    		catch(IoException e)
    		{
    		}
    		
    		finally{
    			if(out!=null) out.close();
    			if(buff!=null) buff.close();  //Mi avevi detto che bastava chiudere solo buff e non reader perchè è più interna o sbaglio?
    		}
    		
    	}
    }


    codice:
    >javac Invertirelerighe.java
    Invertirelerighe.java:17: '.class' expected
    			buff.mark(int 1000);
    			              ^
    Invertirelerighe.java:17: ';' expected
    			buff.mark(int 1000);
    			                    ^
    2 errors
    >Exit code: 1
    Non capisco cosa manca...P.S. non capisco in ogni caso come fare a stabilire quale valore passare come parametro a mark per indicare quanti byte leggere prima di invalidare la posizione.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Darèios89
    Ho provato a fare un esercizio che ho scritto sopra, ho scritto il codice adesso, non ho ben visto se ci sono errori di logica, ora controllo ma intanto posto ciò che ho scritto.
    Il problema è che vorrei risolverlo inserendo le righe in un array, e stamparlo su file al contrario, così da avere le stringhe al contrario.
    A parte che non va messo 'int' nel passaggio degli argomenti ... non è mica una dichiarazione!

    Poi per "le stringhe al contrario" cosa intendi? Rovesciare le righe o rovesciare i caratteri in ogni riga o ... entrambi?

    Si può fare tutto questo ... senza ready() (no, non ti serve!), senza mark/reset (che non vedo come possa aiutarti) e anche senza array (ma con una collezione List).

    Leggi in ciclo con readLine(), butti ogni riga in un ArrayList. Quindi o rovesci le righe iterando la lista al contrario o rovesciando i caratteri in una riga o entrambi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Allora c'era qualche altro errore, ho riscritto il codice.
    Si hai ragione, si può fare tutto con una List, il fatto è che volendo potrei farlo, perchè il corso è finito e le abbiamo fatte
    Però questo esercizio è stato assegnato all'inizio del corso, quando ancora non le avevamo studiate, credo sia proprio questa la difficoltà, risolverlo senza tutti quegli strumenti.

    Per quanto riguarda lo scopo del programma sarebbe quello di invertire le righe in questo modo:

    "Nel mezzo del cammin di nostra vita
    mi ritrovai per una selva oscura
    che la dritta via era smarrita"
    Invertito:

    "che la dritta via era smarrita
    mi ritrovai per una selva oscura
    Nel mezzo del cammin di nostra vita"
    Proprio invertendo la prima con l'ultima e via dicendo:

    Il programma mi va in loop....però, non so se dipenda dall'uso di mark e reset.

    codice:
    import java.io.*;
    
    public class Invertirelerighe
    {
    	public static void main(String [] args) throws IOException
    	{
    		FileReader reader=null;
    		BufferedReader buff=null;
    		PrintWriter out=null;
    		
    		try
    		{
    			reader=new FileReader("input.txt");
    			buff=new BufferedReader(reader);
    			out=new PrintWriter("output.txt");
    			
    			buff.mark(100);
    			
    			int righe=0;
    			
    				while(buff.ready())
    					righe++;
    			
    			String [] frasi=new String[righe];
    			
    			buff.reset();
    				
    				int a=0;
    				
    				while(buff.ready())
    				
    					frasi[a++]=buff.readLine();
    				
    				for(int i=frasi.length-1; i>=0; i--)
    				
    					out.print(frasi[i]+"\r"+"\n");
    		}
    		
    		catch(IOException e)
    		{
    		}
    		
    		finally{
    			if(out!=null) out.close();
    			if(buff!=null) buff.close();
    		}
    		
    	}
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.