Если вы копаете в источник DataInputStream, getAvailable () фактически делегируется потоку, из которого его считывают, поэтому 2048 приходит из входного потока сокета, а не из DataInputStream (который реализован по умолчанию в собственном коде).
Также имейте в виду, что API-интерфейс для InputStream
Обратите внимание, что в то время как некоторые реализации
InputStream вернет сумму
количество байтов в потоке, много
не буду. Никогда не правильно использовать
возвращаемое значение этого метода
выделить буфер, предназначенный для хранения всех
данные в этом потоке.
То есть, если вы получаете значение 2048, это не означает, что больше нет доступных данных, это просто сумма, которая гарантированно будет прочитана без блокировки. Также обратите внимание, что хотя BufferedInputStream, как предложено Александром, является опцией, это не гарантирует, что буфер будет всегда заполнен (фактически, если вы посмотрите на источник, он только попытается заполнить буфер, когда сделан один из вызовов чтения).
Так что, если вы хотите убедиться, что вы всегда получаете «полные пакеты», вам, вероятно, лучше создать собственную оболочку входного потока, в которую вы можете добавить специальный метод «byte [] readPacket ()», который будет блокировать до тех пор, пока он не сможет заполнить собственный буфер при чтении данных из основного потока сокета.