Некоторые келобайты читаются из сокета, но не записываются в файл
Я на стороне сервера и получаю изображение в виде двоичного потока от клиента, сервер Обнаруживает, что мы имеем дело с изображением и размером в байтах, поступивших на сервер с помощью предыдущего сообщения от клиента!
сервер имеет размер файла, который должен быть прочитан, и поток... Eter to while loop... чтение из клиентского потока, немедленная запись в файл и сброс буфера для чтения
Все работает хорошо до тех пор, пока несколько килобайт до конца файла, некоторые килобайты не записываются в файл... Я получаю меньший файл в библиотеке сервера... (и я вижу изображение с маленькой серой строкой внизу.
вот моя попытка:
/*loop*/ while (bytesRemaining!=0) {
try {
// read from client
baos = new ByteArrayOutputStream();
bytesRemaining = sizeToread - readtotal;
bytesRead = OIS.read(aByte, 0, bytesRemaining);
readtotal+=bytesRead;
System.out.println( ", Remaining: " +bytesRemaining);
System.out.println("read at oce: "+bytesRead) ;
System.out.println(++i+") have Read: "+ readtotal+", aByte:"+aByte[i-1]);
try {
baos.write(aByte); // write first byte to buffer
try{
bos.write(baos.toByteArray(),0,bytesRead);
}catch (IOException s){ System.out.println("not write to file"+s);}
baos.reset();
// bos.flush();
} catch (IOException ex) {
Logger.getLogger(ThrdConv.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("baos.write(aByte); error = "+ex );
}
// if (!(OIS.available()> 0))break; // until uavailabil stream
} catch (EOFException eoff) {
Logger.getLogger(ThrdConv.class.getName()).log(Level.SEVERE, null, eoff);
System.out.println("Line 601 error= "+eoff );
break;
} catch (IOException ex) {
Logger.getLogger(ThrdConv.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("Line 612,613 error= "+ex );
}
} //loop End ///////////////////////////////////////////
примечание: размер файла: 474591
Мои отпечатки дают:
...
...
...
458) have Read: 468992, aByte:52
, Remaining: 5599
read at oce: 1024
459) have Read: 470016, aByte:59
, Remaining: 4575
read at oce: 1024
460) have Read: 471040, aByte:-117
, Remaining: 3551
read at oce: 1024
461) have Read: 472064, aByte:-110
, Remaining: 2527
read at oce: 1024
462) have Read: 473088, aByte:-8
, Remaining: 1503
read at oce: 1024
463) have Read: 474112, aByte:-124
, Remaining: 479
read at oce: 479
464) have Read: 474591, aByte:125
, Remaining: 0
read at oce: 0
465) have Read: 474591, aByte:30
realfile: C:\wamp\www\RandomSendServer\images\1384252358431.jpg
have Read: 474591 !!!
URL sent Back
Я получаю файл с размером 466944 вместо: 474591 .... любая помощь
Обновить
according to answer 1 I make this change... my loop now looks:
while ((bytesRead = OIS.read(aByte))>1)
{ bos.write(aByte,0,bytesRead);
i+=bytesRead;
System.out.println(bytesRead+" "+i);
}
печать:
всего прочитано: 474591 реальный файл: C:\wamp\www\RandomSendServer\images\1384262866220.jpg URL отправлен
но та же проблема все еще цикл сказать, что он прочитал все 474 591... но когда я проверяю файл, его размер: 466 944
Окончательное решение
while( ( bytesRead = OIS.read(aByte))>0)
{
fos.write(aByte,0,bytesRead);
i+=bytesRead; // i is a counter
if(i==sizeToread) break; // force to stop when read all the bytes in the file!
}
1 ответ
Этот ужасный код настолько пронизан ошибками, заблуждениями и бессмысленными намеками, что ваш лучший путь - просто выбросить его. Канонический способ копирования потоков в Java заключается в следующем:
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
Обратите внимание, что вам не нужно никаких ByteArrayInput/OutputStreams
на всех, но вам нужно обработать результат, возвращенный read()
, И будь проще. Задача не так сложна, как вы ее сделали.
РЕДАКТИРОВАТЬ Вы не указали, что ваш коллега не закрывал соединение после отправки файла, который меняет вещи. Ваше "окончательное решение" не сработает. Это обычно будет превышать длину. Вам нужно изменить вызов read следующим образом:
while (i < sizeToRead && (count = in.read(buffer, 0, sizeToRead-i > buffer.length ? buffer.length : (int)(sizeToRead-i))) > 0)
и удалите внутренний тест.