Java получить и объединить файл из нескольких потоков

1

У меня проблемы. Я хотел бы отправить файл 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 где-то там, где это не должно быть, но я действительно не знаю...

Большое спасибо за ответ

Теги:
multithreading

1 ответ

1
Лучший ответ

Из документации InputStream.read:

Считывает до len байтов данных из входного потока в массив байтов. Делается попытка считывать столько, сколько len байтов, но может быть прочитано меньшее число. Число фактически прочитанных байтов возвращается как целое число.

Вы всегда должны chceck возвращать значение read, так как оно не гарантируется (и, в случае сокетов TCP, даже не типично), чтобы прочитать количество байтов, которое оно ожидало.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню