devo concordare con @gene, provare con un BufferedReader e GetLine primo luogo, è semplice e facile da codice. Basta fare attenzione a non creare alias l'array di supporto tra il risultato di getLine e qualsiasi operazione di sottostringa che si utilizza. String.substring() è un colpevole particolarmente comune, e ho avuto array di byte multi-MB bloccati in memoria perché una sottostringa a 3 caratteri stava facendo riferimento a esso.
Assumendo ASCII, la mia preferenza quando si esegue questa operazione è di scendere al livello di byte. Utilizzare mmap per visualizzare il file come ByteBuffer
e quindi eseguire una scansione lineare per 0x20 e 0x0A (presupponendo separatori di riga in stile unix). Quindi converti i byte rilevanti in una stringa. Se si utilizza un set di caratteri a 8 bit è estremamente difficile essere più veloce di questo.
Se si utilizza Unicode, il problema è sufficientemente più complicato che consiglio vivamente di utilizzare BufferedReader
a meno che le prestazioni non siano effettivamente accettabili. Se getLine()
non funziona, prendi in considerazione semplicemente il loop su una chiamata a read()
.
Indipendentemente da quando si inizializza una stringa da un puntatore esterno, è necessario specificare sempre il set di caratteri. Questo documenta esplicitamente la tua assunzione di caratteri.Quindi raccomando una piccola modifica al suggerimento del gene, quindi uno di:
int i = Integer.parseInt(new String(buffer, start, length, "US-ASCII"));
int i = Integer.parseInt(new String(buffer, start, length, "ISO-8859-1"));
int i = Integer.parseInt(new String(buffer, start, length, "UTF-8"));
come appropriato.
Ogni riga contiene esattamente lo stesso numero di caratteri? – cheeken
no in realtà ... – Frank
Mi sono perso. La cifra del formato 1 è seguita da 1 spazio, ecc. Con esattamente lo stesso numero di caratteri su ciascuna riga? – Gene