Есть несколько проблем с вашим кодом.Файлы пусты, потому что вы не закрываете авторов.Вы даже создаете избыточные средства записи, как в этой последовательности
fileWriter = new BufferedWriter(new FileWriter("src" + "//" + outputFile));
fileWriter = new BufferedWriter(new FileWriter(filename));
Чтобы оптимально обрабатывать ресурсы, такие как средства чтения и записи, используйте оператор try-with-resources .
Отсутствующие новые строки - лишь небольшая проблема.
Кроме того, вы без необходимости считываете весь входной файл в кучную память, чтобы иметь возможность выполнить сомнительную операцию потока с ним.Несмотря на то, что существует возможность потоковой передачи по файлу напрямую, например, с помощью Files.lines
, группировка с AtomicInteger
в любом случае не предназначена для использования Stream
.И конечный результат по-прежнему будет содержать все входные строки в памяти, в то время как было бы просто записать строки в целевой файл немедленно.
Простое и эффективное решение будет
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class ChunkTextFile {
private static final String inputFilename = "inputFile.txt";
public static void main(String[] args) {
final int size = 10000;
try(BufferedReader reader=Files.newBufferedReader(Paths.get("src", inputFilename))) {
String line = reader.readLine();
for(int count = 0; line != null; count++) {
try(BufferedWriter writer = Files.newBufferedWriter(
Paths.get("batched_items_file_" + count + ".txt"))) {
for(int i = 0; i < size && line != null; i++) {
writer.write(line);
writer.newLine();
line = reader.readLine();
}
}
}
}
catch(IOException ex) {
ex.printStackTrace();
}
}
}