Pages: [1]   Go Down
Print
Author Topic: Utilizzare il metodo mark()  (Read 1097 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« on: 31-07-2010, 22:41:22 »

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.
Quindi dopo effettuavo una seconda lettura, ma non è molto efficiente.
Come si utilizza il metodo mark?
Ho provato a scrivere il codice, ma l'output è vuoto.

Code:
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(1000);

int righe=0;

while(buff.ready())
{
righe++;
buff.readLine();
}

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();
}

}
}
« Last Edit: 31-07-2010, 22:45:01 by Daréios » Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #1 on: 01-08-2010, 01:17:14 »

1. Non ho capito come mai hai fatto in modo che l'istruzione
Code:
if(buff!=null) buff.close();
fosse scritta nel corpo del ramo "finally" del costrutto "try...catch", costringendo di fatto "main" ad essere un metodo che può lanciare "IOException".

2. Sai a cosa serve il metodo mark? Come mai hai passato come parametro proprio 1000? Sai quando conviene usarlo? Sai che "costo" (in termini di risorse spaziali impiegate) ha l'utilizzo del metodo mark? Credo di essere io uno di quelli di cui tu parli quando dici che "ti è stato detto" (senza specificare da chi boh).
Ad ogni modo, due sole letture da un file, considerato il costo spaziale di una operazione mark e quello che devi fare tu, non sono necessariamente un male .

3. Viene esplicitamente richiesto di non leggere due volte dal file?

Mmm... dopo tutte queste domande che ti ho fatto, e dopo una breve ricerca tra i messaggi vecchi... credo che invece di aprire una nuova discussione, in realtà tu volessi continuare quest'altra. Ci ho azzeccato ok?
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #2 on: 01-08-2010, 13:43:17 »

I costi del metodo mark non li conosco, il parametro passato a mark dovrebbe indicare quanti byte leggere prima che la marcatura possa diventare invalida (credo), ma non ho capito come usarlo.
Ad ogni modo, se in questo caso dici che una doppia lettura è più efficiente dell'utilizzo del metodo mark..
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #3 on: 01-08-2010, 17:21:24 »

Se nessun docente vi ha mai introdotto il metodo mark, certamente non siete obbligati a usarlo. Anzi, a volte, specie se non si sa cosa si sta facendo, è meglio evitare di usare cose non spiegate, altrimenti si fa più brutta figura usandole all'esame boh.

Ad ogni modo, il costo in risorse spaziali di una invocazione al metodo mark è la creazione di un buffer grande al massimo quanto specificato come parametro di mark. Creare un buffer grande quanto il file di input a tutti gli effetti equivale a creare due buffer per la lettura, uno dei quali non più piccolo del file stesso. Si dirà che però la RAM (o comunque la memoria volatile) è più veloce del disco rigido, tuttavia su grandi quantità di dati, se comunque devo leggere dall'hard disk, è preferibile leggere due volte dall'hard disk che allocare buffer in memoria di, non so, 2 gb di dati, ad esempio, e questo è un fatto non trascurabile nella vita reale .
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
Pages: [1]   Go Up
Print
Jump to: