per risparmiare memoria, non conservare inutilmente/duplicare i dati in memoria (cioè non li si assegna a variabili fuori dal ciclo). Elabora l'output immediatamente non appena l'input arriva.
Non importa se stai utilizzando BufferedReader
o meno. Non costerà molto più memoria, come suggeriscono implicitamente alcuni. Al massimo colpirà solo un po 'di% delle prestazioni. Lo stesso vale per l'utilizzo di NIO. Migliorerà solo la scalabilità, non l'uso della memoria. Diventerà interessante solo quando centinaia di thread sono in esecuzione sullo stesso file.
Basta scorrere il file, scrivere immediatamente ogni riga su un altro file mentre si legge, contare le righe e se raggiunge 100, quindi passare al file successivo, eccetera.
Kickoff esempio:
String encoding = "UTF-8";
int maxlines = 100;
BufferedReader reader = null;
BufferedWriter writer = null;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream("/bigfile.txt"), encoding));
int count = 0;
for (String line; (line = reader.readLine()) != null;) {
if (count++ % maxlines == 0) {
close(writer);
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("/smallfile" + (count/maxlines) + ".txt"), encoding));
}
writer.write(line);
writer.newLine();
}
} finally {
close(writer);
close(reader);
}
Utilizzare API byte (ad esempio FileInputStream, ByteChannel), anziché API carattere (BufferedReader, etc.). Altrimenti, stai codificando e decodificando inutilmente. –
La divisione di un file di testo utilizzando i byte sarebbe una cattiva idea. – james