У меня проблемы. Я хотел бы отправить файл partialy в 4 сокета, где каждый сокет связан с 1 потоком. Протокол, который я использую, - TCP. Я думаю, что когда я отправляю файл, я отправляю его на сокеты в хорошем состоянии. Но у меня проблема со стороны, где я получаю байты и пытаюсь объединить ее в файл. Вот мой код потока для получения байтов из сокета.
long i = fromIdx;
//file.seek(fromIdx);
while (i < fromIdx+partLen) {
int arrSize = ((i + 1000 > fromIdx+partLen) ? (int)(fromIdx+partLen-i) : 1000);
byte[] data = new byte[arrSize];
input.read(data);
synchronized(file) {
System.out.println(i);
file.seek(i);
file.write(data);
//fromIdx = file.getFilePointer();
i += arrSize;
}
}
файл имеет тип RandomAccessFile. Основная проблема заключается в том, что некоторые байты в результате - это нули. Я думаю, что другие находятся в хорошем состоянии. Я действительно не знаю, где проблема. Может быть, некоторая синхронизация проблемы при поиске набора filePointer где-то там, где это не должно быть, но я действительно не знаю...
Большое спасибо за ответ
Из документации InputStream.read
:
Считывает до len байтов данных из входного потока в массив байтов. Делается попытка считывать столько, сколько len байтов, но может быть прочитано меньшее число. Число фактически прочитанных байтов возвращается как целое число.
Вы всегда должны chceck возвращать значение read
, так как оно не гарантируется (и, в случае сокетов TCP, даже не типично), чтобы прочитать количество байтов, которое оно ожидало.