public final State readToNextMarkerPartial ( ByteBuffer out ) throws IOException { if ( done ) return State . STOP ; int skipOneMarker = curMarker >= 0x100 && curMarker <= 0x1ff ? 1 : 0 ; int written = out . position ( ) ; do { while ( buf . hasRemaining ( ) ) { if ( curMarker >= 0x100 && curMarker <= 0x1ff ) { if ( skipOneMarker == 0 ) { return State . DONE ; } -- skipOneMarker ; } if ( ! out . hasRemaining ( ) ) return State . MORE_DATA ; out . put ( ( byte ) ( curMarker >>> 24 ) ) ; curMarker = ( curMarker << 8 ) | ( buf . get ( ) & 0xff ) ; } buf = NIOUtils . fetchFromChannel ( channel , fetchSize ) ; pos += buf . remaining ( ) ; } while ( buf . hasRemaining ( ) ) ; written = out . position ( ) - written ; if ( written > 0 && curMarker >= 0x100 && curMarker <= 0x1ff ) return State . DONE ; for ( ; bytesInMarker > 0 && out . hasRemaining ( ) ; ) { out . put ( ( byte ) ( curMarker >>> 24 ) ) ; curMarker = ( curMarker << 8 ) ; -- bytesInMarker ; if ( curMarker >= 0x100 && curMarker <= 0x1ff ) return State . DONE ; } if ( bytesInMarker == 0 ) { done = true ; return State . STOP ; } else { return State . MORE_DATA ; } }
Reads one full segment till the next marker . Will read as much data as the provided buffer fits if the provided buffer doesn t fit all data will return MORE_DATA .