Отправка большого файла по каналу TCP с сериализацией - PullRequest
2 голосов
/ 28 февраля 2012

Я занимаюсь разработкой клиент-серверной системы на Java. Я отправляю сообщения по каналу TCP с сериализованными объектами.

Мне также нужно будет отправлять файлы. Я мог бы просто определить свой собственный класс сообщений:

public class SendFile implements Serializable {
    private byte[] fileContents;

    ...
}

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

Я прочитал о Externalizable, но это будет не лучше, если файл все еще будет считываться во всю память моего компьютера перед отправкой по каналу TCP. Мне нужен какой-то "ленивый" способ сделать это (чтение с диска при отправке по сети и удаление из памяти того, что уже прочитано).

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

EDIT:

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

Один из способов обойти это использование streaming .Потоковый подход не загружает все содержимое в память.Вы можете открыть два потока: input-stream из объекта, который будет отправлен по сети, и output-stream для соединения через сокет TCP.

В Java оба InputStream и OutputStream .поддержка чтения и записи байтов.

Вы можете определить размер буфера (байтовый массив).Считайте (из файла) содержимое в этот буфер, используя InputStream.read(byte[] b), и запишите (в сокет TCP) тот же буфер в выходной поток, используя OutputStream.write(byte[] b)

0 голосов
/ 02 марта 2012

Вместо использования Java Serilization вы можете напрямую прочитать файл на Java в буфере и отправить этот буфер по сети. Зачем включать Java сериализацию в ч / б и усложнять вещи. Используя простую н / ж программу, вы сможете отправлять свои файлы.

...