Java — Передача больших файлов по каналам — NIO

Мне нужно передать ~100 МБ данных через ServerSocket с помощью NIO, но я не могу понять, как это сделать, не прерывая передачу в любом месте/сохраняя состояние передачи.

Моя первая идея заключалась в том, чтобы отправить размер файла, видимо, я не могу отправить размер таких больших файлов, потому что он даже не помещается в ОЗУ сразу. Тогда я подумал, почему бы просто не передавать до тех пор, пока ничего не будет получено, но именно тогда возникает проблема.

Даже если я пишу данные на стороне сервера все время

        FileChannel fc = new FileInputStream(f).getChannel();
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        while(fc.read(buffer) > 0) {
            buffer.flip();
            while(channel.write(buffer) > 0);
            buffer.clear();
        }

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

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

Мне также интересно, есть ли лучший способ отправить весь буфер, чем ниже

while(channel.write(buffer) > 0);
6
задан Ruuhkis 20 May 2012 в 20:53
поделиться