Pour économiser de la mémoire, ne stockez pas/ne dupliquez pas inutilement les données en mémoire (c'est-à-dire ne les affectez pas à des variables en dehors de la boucle). Traitez simplement la sortie immédiatement dès que l'entrée se fait.
Cela n'a vraiment aucune importance que vous utilisiez BufferedReader
ou pas. Cela ne coûtera pas beaucoup plus de mémoire comme certains semblent le suggérer implicitement. Au mieux, cela n'affectera que quelques % des performances. Il en va de même pour l'utilisation de NIO. Elle n'améliorera que l'évolutivité, pas l'utilisation de la mémoire. Cela ne deviendra intéressant que lorsque des centaines de threads fonctionneront sur le même fichier.
Il suffit de parcourir le fichier en boucle, d'écrire chaque ligne immédiatement dans l'autre fichier au fur et à mesure de la lecture, de compter les lignes et s'il atteint 100, de passer au fichier suivant, et ainsi de suite.
Exemple de coup d'envoi :
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);
}
7 votes
Utilisez des API d'octets (par exemple FileInputStream, ByteChannel), plutôt que des API de caractères (BufferedReader, etc.). Sinon, vous encodez et décodez inutilement.
3 votes
Diviser un fichier texte en utilisant des octets serait une mauvaise idée.