2016-04-24 4 views
0

В моем приложении я отправляю файл с клиента, используя сокеты. С другой стороны, другой клиент получает файл, используя InputStream, а затем bufferedOutputStream сохраняет файл в системе.InputStream.read() зависает при чтении файла

Я не знаю, почему файл не передан полностью. Я думаю, что это из-за перегрузки сети, во всяком случае, я не знаю, как ее решить.

TRANSMITER является:

Log.d(TAG,"Reading..."); 
       bufferedInputStream.read(byteArrayFile, 0, byteArrayFile.length); 
       Log.d(TAG, "Sending..."); 
       bufferedOutputStream.write(byteArrayFile,0,byteArrayFile.length); 

bufferedOutputStream.flush(); 

Приемник:

bufferedOutputStream=new BufferedOutputStream(new FileOutputStream(file)); 
          byteArray=new byte[fileSize]; 

          int currentOffset = 0; 

          bytesReaded = bufferedInputStream.read(byteArray,0,byteArray.length); 
          currentOffset=bytesReaded; 

          do { 
           bytesReaded = bufferedInputStream.read(byteArray, currentOffset, (byteArray.length-currentOffset)); 
           if(bytesReaded >= 0){ currentOffset += bytesLeidos; 
           } 
          } while(bytesReaded > -1 && currentOffset!=fileSize); 


          bufferedOutputStream.write(byteArray,0,currentOffset); 
+0

попытайтесь зарегистрировать значение bytesReaded и посмотреть, как это будет. – AdamSkywalker

+0

Как правило, рекомендуется переходить к вашему отладчику и проверять значения переменных. –

+0

Я сделал это раньше. Например, если файл имеет 10000 байт, он застревает, когда он получил 9000 байт. –

ответ

3

Вы не сообщают, где filesize пришли, но есть множество проблем с этим кодом. Слишком много, чтобы упомянуть. Бросьте все это и используйте DataInputStream.readFully(). Или используйте следующий цикл копирования, который не требует буфера размера файла, метод, который не масштабироваться, предполагает, что размер файла помещается в int, и добавляет задержку:

byte[] buffer = new byte[8192]; 
int count; 
while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 

Используйте это с обоих концов. Если вы отправляете несколько файлов по одному и тому же соединению, он становится более сложным, но вы этого не говорили.

+0

В вашем цикле переменная «in» будет «InputStream»? –

+0

@MMManuel Конечно, и 'out' будет' OutputStream'. Я не думал, что это необходимо. – EJP

+0

Не следует ли увеличивать счетчик в «счете» каждого события записи? –

Смежные вопросы