Path: csiph.com!news.redatomik.org!aioe.org!.POSTED!not-for-mail From: "Dr.UgoGagliardelli" Newsgroups: it.comp.java Subject: Re: Leggere lo stesso file TANTE volte Date: Fri, 30 Jun 2017 12:41:29 +0200 Organization: Aioe.org NNTP Server Lines: 51 Message-ID: References: NNTP-Posting-Host: EKOb9gxv6vG08agtW1ZOBA.user.gioia.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Complaints-To: abuse@aioe.org User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 Content-Language: it-IT X-Notice: Filtered by postfilter v. 0.8.2 X-Antivirus-Status: Clean X-Antivirus: Avast (VPS 170629-0, 29/06/2017), Outbound message Xref: csiph.com it.comp.java:9107 Il 30.06.2017 07.56, Oliviero ha scritto: >> Sinceramente pensavo che la tua fosse una domanda così banale da meritare >> un laconico RTFM. In realtà non è così, in quanto sostanzialmente >> BufferedReader sembrerebbe non essere pensato per un uso simile. In >> pratica, >> hai due modi per ottenere quello che vuoi: >> >> - Il primo è impostare sul BufferedReader un marcatore subito dopo >> averlo >> aperto, in modo tale che eseguendo un reset il puntatore ritorni a >> quell'area del file. >> - Il secondo è usare un RandomAccessFile al posto del >> BufferedReader, che ti >> permette di fare un seek del puntatore all'inizio del file >> >> Enrico > > Grazie della risposta. > Come faccio a impostare il marcatore? Qualsisi classe che estenda java.io.Reader, quindi anche BufferedReader, ha anche i metodi: - boolean markSupported() - public void mark(int limit) - public void reset() se markSupported() risponde true, allora puoi usare sia mark che reset. Per utilizzare mark, devi specificare il limite fino a quando il mark sara' valido, facendo attenzione che se questo limite e' troppo grande, il reader allocara' un nuovo buffer grande almeno come il limite imposto. Avrai fatto caso che limit e' di tipo int, quindi il buffer sara' al massimo grande Integer.MAX_INT, ma il file che stai leggendo potrebbe essere molto piu' grande, quindi l'operazione mark/reset allo scopo di riposizionare il reader all'inizio non avrebbe senso. Nel caso che il file sia di dimensioni contenute, allora potresti usare il codice: File f=new File("C:/miofile.txt"); long length = f.length(); if (length <= Integer.MAX_VALUE) { int limit = (int) length; FileReader fileReader=new FileReader(f); reader=new BufferedReader(fileReader, limit); reader.mark(limit); ... // rileggo dall'inizio reader.reset(); ... } Guardare la documentazione qui https://docs.oracle.com/javase/8/docs/api/java/io/BufferedReader.html e' comunque il miglior consiglio.