BufferedReader read(cbuf, off, len)

di il
2 risposte

BufferedReader read(cbuf, off, len)

Ciao,

Sto giocando con le classi BufferedReader e BufferedWriter per capire bene come funzionano.

I metodi chiave mi sono abbastanza chiari, ora però sto cercando di fare un metodo che copi un file di testo a blocchi in modo da non leggerlo e scriverlo tutto per ottimizzare l'occupazione della ram impostanto dei valori a piacimento (ho messo 1024 ma potrei ridurre anche a d esempio a .

Se ho capito bene ( condizione da verificare) il metodo che fa al caso mio è read(cbuf, off, len).

come primo step ho cercato di verificare il funzionamento di questo metodo stampando a console i dati che il metodo legge e il discorso mi sembra stare in piedi. Di seguito il metodo
	public boolean esempioBufferedFileReader(String filePath) {
		boolean readOk=false;
		File f = new File(filePath);
		if(f.exists()&&f.isFile()) {
			BufferedReader fr =null; 

			try {
				fr = new BufferedReader(new FileReader(f));
				char[] text = new char[1024]; 	
				String textToPrint="";
				int len=0;
				while((len=fr.read(text, 0, text.length))!=-1) {
					for (int i=0;i<len;i++) {
						textToPrint+=text[i];
					}
				}
				System.out.print(textToPrint);
		
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}
			catch (IOException e) {
				e.printStackTrace();
			}finally {
				try {
					fr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}		
		}
		return readOk;
	}
Mi chiedevo se ha senso utilizzare un metodo del genere oppure non ha senso e tanto vale utilizzare il readLine e lavorare una riga alla volta?

Se per assurdo avessi un file con un unica riga ma lungo in maniera irragionevole con il readLine non ho il controllo di quanto spazio viene allocato runtime giusto?

2 Risposte

  • Re: BufferedReader read(cbuf, off, len)

    Lucadf89 ha scritto:


    Mi chiedevo se ha senso utilizzare un metodo del genere oppure non ha senso e tanto vale utilizzare il readLine e lavorare una riga alla volta?
    No, non ha senso. BufferedReader ha un suo buffer char[] interno. E il tuo char[] text è un ulteriore "buffer" utilizzato "al di sopra" del BufferedReader. Insomma, è un doppio buffering che in realtà non serve a nulla.

    Inoltre per ricomporre tutto il contenuto parti da una stringa vuota "" e poi vai avanti usando la concatenazione delle stringhe textToPrint+=text[i] per aggiungere UN (1 !) carattere per volta. Questo è SUPER ALTAMENTE inefficiente e rende completamente vani i benefici del buffering (singolo o doppio che sia).

    Conclusione: no, non è quello il modo appropriato di "ragionare".

    Lucadf89 ha scritto:


    Se ho capito bene ( condizione da verificare) il metodo che fa al caso mio è read(cbuf, off, len).
    P.S. nota che il:

    int read(char cbuf[])

    sotto-sotto fa nient'altro che invocare l'altro read(char[] cbuf, int off, int len) facendo:

    return read(cbuf, 0, cbuf.length);

    Quindi l'uso esplicito di fr.read(text, 0, text.length) è inutile, si poteva usare semplicemente fr.read(text)
  • Re: BufferedReader read(cbuf, off, len)

    Chiaro
    Grazie mille
Devi accedere o registrarti per scrivere nel forum
2 risposte