Проблемы с записью в DataOutputStream и чтением из RandomAccessFile с буфером
DataOutputStream lWriter = new DataOutputStream(connection.getOutputStream());
int bytesRead = 0;
int offset = 0;
byte[] bytes = new byte[1048576]; // read 1MB at a time
RandomAccessFile f = new RandomAccessFile(xmlFile, "rw");
while(bytesRead != -1){
offset += f.read(bytes, offset, bytes.length);
if (bytesRead != -1){
lWriter.write(bytes, 0, bytes.length);
}
}
С помощью этого кода я получаю исключение индекса за пределами границ в f.read(). Возможно, я неправильно использую аргументы offset и length. Разве каждый раз, когда я читаю в чанке, я должен сдвигать смещение на размер чанка? Может быть, мне просто нужно меньше читать вовремя и использовать меньший буфер?
В настоящее время у меня работает эта реализация, но я беспокоюсь об использовании памяти:
DataOutputStream lWriter = new DataOutputStream(connection.getOutputStream());
lWriter.write(fileToBytes(xmlFile));
Спасибо за любую помощь!
1 ответ
Канонический способ копирования потоков в Java заключается в следующем:
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
// bytesRead += count; // if you are counting
}
Ваш цикл содержит множество ошибок. Смещение - это смещение в буфер, а не в файл, и вам редко приходится его использовать. Вам не нужно продвигать смещение. Вы тестируете bytesRead, но никогда не устанавливаете его после инициализации. Вы не проверяете EOS перед тем, как увеличить счет. Вы не используете счетчик чтения при записи, поэтому вы записываете ненужные файлы.