@@ -330,7 +330,9 @@ default String findString(final boolean saveString, final int blockSize,
330330 * @return the next byte of data, or -1 if the end of the stream is reached.
331331 * @throws IOException - if an I/O error occurs.
332332 */
333- int read () throws IOException ;
333+ default int read () throws IOException {
334+ return offset () < length () ? readByte () & 0xff : -1 ;
335+ }
334336
335337 /**
336338 * Reads up to b.length bytes of data from the stream into an array of bytes.
@@ -368,4 +370,102 @@ default long skip(final long n) throws IOException {
368370 return num ;
369371 }
370372
373+ // -- DataInput methods --
374+
375+ @ Override
376+ default boolean readBoolean () throws IOException {
377+ return readByte () != 0 ;
378+ }
379+
380+ @ Override
381+ default void readFully (final byte [] b ) throws IOException {
382+ readFully (b , 0 , b .length );
383+ }
384+
385+ @ Override
386+ default int readUnsignedByte () throws IOException {
387+ return readByte () & 0xff ;
388+ }
389+
390+ @ Override
391+ default int readUnsignedShort () throws IOException {
392+ return readShort () & 0xffff ;
393+ }
394+
395+ @ Override
396+ default String readLine () throws IOException {
397+ // NB: Code adapted from java.io.RandomAccessFile.readLine().
398+
399+ final StringBuffer input = new StringBuffer ();
400+ int c = -1 ;
401+ boolean eol = false ;
402+
403+ while (!eol ) {
404+ switch (c = read ()) {
405+ case -1 :
406+ case '\n' :
407+ eol = true ;
408+ break ;
409+ case '\r' :
410+ eol = true ;
411+ long cur = offset ();
412+ if (read () != '\n' ) seek (cur );
413+ break ;
414+ default :
415+ input .append ((char )c );
416+ break ;
417+ }
418+ }
419+
420+ if (c == -1 && input .length () == 0 ) {
421+ return null ;
422+ }
423+ return input .toString ();
424+ }
425+
426+ @ Override
427+ default String readUTF () throws IOException {
428+ final int length = readUnsignedShort ();
429+ final byte [] b = new byte [length ];
430+ read (b );
431+ return new String (b , "UTF-8" );
432+ }
433+
434+ @ Override
435+ default int skipBytes (final int n ) throws IOException {
436+ final int skipped = (int ) Math .min (n , length () - offset ());
437+ if (skipped < 0 ) return 0 ;
438+ seek (offset () + skipped );
439+ return skipped ;
440+ }
441+
442+ // -- DataOutput methods --
443+
444+ @ Override
445+ default void write (final byte [] b ) throws IOException {
446+ write (b , 0 , b .length );
447+ }
448+
449+ @ Override
450+ default void writeBoolean (final boolean v ) throws IOException {
451+ write (v ? 1 : 0 );
452+ }
453+
454+ @ Override
455+ default void writeByte (final int v ) throws IOException {
456+ write (v );
457+ }
458+
459+ @ Override
460+ default void writeBytes (final String s ) throws IOException {
461+ write (s .getBytes ("UTF-8" ));
462+ }
463+
464+ @ Override
465+ default void writeUTF (final String str ) throws IOException {
466+ final byte [] b = str .getBytes ("UTF-8" );
467+ writeShort (b .length );
468+ write (b );
469+ }
470+
371471}
0 commit comments