I / O del disco sostenuti da readLine () in Java

1

La funzione readLine() di Java utilizzata con BufferedReader causa un I / O del disco per chiamata?

Se sì, c'è un modo per leggere un numero specifico di righe, ad esempio n, da un file di testo che causa solo un I / O del disco?

Ecco il codice:

String file;
BufferedReader br = new BufferedReader (new FileReader (file));
int n = 10;
for (int i = 0; i < n; i++)
{
    String line = br.readLine ();
    /* Do something */
}
    
posta high5 12.03.2013 - 19:23
fonte

3 risposte

7

Dipende da quanto sono grandi le tue linee.

Per impostazione predefinita, BufferedReader utilizza un buffer da 8k (vedi fonte ). Ciò significa che tenterà di leggere 8K alla volta dal Reader che è stato costruito intorno. Puoi leggere tutte le righe che si adattano a quel buffer 8K, senza tornare al Reader sottostante.

Modifica: come commento generale, non utilizzare FileReader . Invece, imposta FileInputStream con InputStreamReader e specifica la codifica .

    
risposta data 12.03.2013 - 19:36
fonte
5

Stai attraversando diversi livelli di astrazione tra il codice java e il disco. C'è Java Virtual Machine e la sua implementazione specifica, e poi c'è il sistema operativo su cui è in esecuzione la JVM, che quindi comunica al disco con un metodo (potrebbe essere un disco di rete, potrebbe essere un raid locale, può essere un'unità a stato solido, può essere un flusso da una rete).

Le specifiche dell'IO su disco sono determinate dalla macchina virtuale e dal sistema operativo e dall'origine sottostante dei dati. Potrebbe essere diverso per vm diversi nel modo in cui chiedono le richieste io - non c'è modo di determinare questo da Java, né c'è un modo per comunicare a quel livello con il disco attraverso Java.

    
risposta data 12.03.2013 - 19:27
fonte
1

No. Un BufferedReader memorizza i dati nel suo buffer interno, ovvero l'intero punto della classe. Se sono già disponibili dati sufficienti, una chiamata a readLine() non genererà un'altra richiesta di I / O.

    
risposta data 12.03.2013 - 19:36
fonte

Leggi altre domande sui tag