Моя программа должна записать дубликаты в файл.Результатом должен быть файл с 1 000 000 000 двойников.Но по какой-то причине ошибка вылетает, когда файл становится 2 гигабайта, это примерно 250 000 удвоений.
В то же время она прекрасно создает файл с 10 000 000 и 100 000 000 двойников. Почему это происходит?
Код:
import java.io.IOException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Random;
import static java.nio.file.StandardOpenOption.*;
public class writeFileMapped {
public static final int BUF_SIZE = 10000 * Double.BYTES;
public static void main (String args[]){
Random random = new Random();
Path path = Paths.get("C:\\Users\\Den\\IdeaProjects\\semester_3\\src\\File_task\\test3.dat");
try (FileChannel channel = FileChannel.open(path, CREATE, WRITE, READ)) {
long startBubbleTime = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
MappedByteBuffer buf = channel.map(FileChannel.MapMode.READ_WRITE, i * BUF_SIZE, BUF_SIZE);
while (buf.hasRemaining()) {
double d = random.nextDouble();
buf.putDouble(d);
}
channel.read(buf);
}
long endBubbleTime = System.currentTimeMillis();
System.out.println(endBubbleTime-startBubbleTime);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Вывод:
Exception in thread "main" java.lang.IllegalArgumentException: Negative position
at java.base/sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:942)
at File_task.writeFileMapped.main(writeFileMapped.java:18)
18 строк = MappedByteBuffer buf = channel.map (FileChannel.MapMode.READ_WRITE, i * BUF_SIZE, BUF_SIZE);