Добавлены пробелы при записи файлов
Я изменяю исходный код 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();
}
}
Наконец, проблема, возможно, заключается не в том, что добавляются пробелы, а в том, что часть данных записана не в том месте. Я собираюсь проверить это.