Добавлены пробелы при записи файлов

Я изменяю исходный код H2 MVStore 1.4.191 для записи файлов, выполняя некоторый поток сна. Большим изменением является то, что файл больше не записывается за один раз, а фрагментами размером 2^16 байт. MVStore использует java nio FileChannel и ByteBuffer для записи своего файла. Проблема в том, что результат отличается от оригинальной версии. Кажется, что FileChannel добавляет пробелы (0x20 в ASCII), например, более 40 подряд. Или, может быть, это не удаляет эти пробелы, в отличие от оригинальной версии, я не знаю.

Я полагаю, это связано с записью файлов. Метод file.write(buffer,position), где file является объектом FileChannel, и который возвращает количество записанных байтов, иногда возвращает меньшее число, чем размер буфера, в исходной версии H2. В моей версии этого никогда не происходит.

У вас есть советы о ByteBuffer, FileChannel и моей проблеме?

2 ответа

В порядке,

Проблема заключалась в том, что я использовал размер ByteBuffer, чтобы разделить его вместо его предела, который меньше (устанавливается H2 во время процесса)

Спасибо за помощь

С уважением

Исходный код вызова работает с записью несколько раз (он записывает заголовок, нижний колонтитул и данные)

 int off = 0;
            do {
                int len = file.write(src, pos + off);
                off += len;
            } while (src.remaining() > 0);

src - это ByteBuffer, а файл - это FileChannelImpl из sun.io. Буфер может содержать более 50 МБ данных.

Из этого кода я разработал решение, которое разделяет ByteBuffer на буферы размером 2^16, которые я пишу, добавив функцию сна между каждым из них:

            int off = 0;
            byte[] buffer = src.array();
            int size = src.array().length;
            int chunkSize = 128;
            List<byte[]> splittedBuffer = new ArrayList<byte[]>();
            int i = 0;
            while (i < size) {
                int start = i;
                int end = i + chunkSize;
                if (end > size)
                {
                    //if buffer size is not a multiple of 2^16, the last 
                    //chunk will be smaller 
                    end = size;
                }
                splittedBuffer.add(Arrays.copyOfRange(src.array(), start, end));
                try {
                    Thread.sleep(5);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                i += chunkSize;
            }
            int offset = 0;
            for (byte[] chunk : splittedBuffer) {
                int len=file.write(ByteBuffer.wrap(chunk),pos+offset);
                offset+=len;
                try {
                    Thread.sleep(5);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

Наконец, проблема, возможно, заключается не в том, что добавляются пробелы, а в том, что часть данных записана не в том месте. Я собираюсь проверить это.

Другие вопросы по тегам