Неверная позиция буфера - PullRequest
       1

Неверная позиция буфера

0 голосов
/ 17 октября 2018

Моя программа должна записать дубликаты в файл.Результатом должен быть файл с 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);

1 Ответ

0 голосов
/ 17 октября 2018

Из того, что я отлаживал, ваша позиция падает на -2147447296, что означает, что это максимальное значение целого числа, просто измените ваши целые на длинные

public static final long BUF_SIZE = 10000 * Double.BYTES;

for (long i = 0; i < 1000000; i++)

Как бы вы ни захотели привести его кдолго, когда вы умножаете позицию, я получил файл до 4 ГБ, а затем остановил программу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...