private ucar . ma2 . Array readRecordData ( ucar . nc2 . Structure s , Section section ) throws java . io . IOException { //if (s.isSubset()) // return readRecordDataSubset(s, section); // has to be 1D Range recordRange = section . getRange ( 0 ) ; // create the ArrayStructure StructureMembers members = s . makeStructureMembers ( ) ; for ( StructureMembers . Member m : members . getMembers ( ) ) { Variable v2 = s . findVariable ( m . getName ( ) ) ; N3header . Vinfo vinfo = ( N3header . Vinfo ) v2 . getSPobject ( ) ; m . setDataParam ( ( int ) ( vinfo . begin - header . recStart ) ) ; } // protect agains too large of reads if ( header . recsize > Integer . MAX_VALUE ) throw new IllegalArgumentException ( "Cant read records when recsize > " + Integer . MAX_VALUE ) ; long nrecs = section . computeSize ( ) ; if ( nrecs * header . recsize > Integer . MAX_VALUE ) throw new IllegalArgumentException ( "Too large read: nrecs * recsize= " + ( nrecs * header . recsize ) + "bytes exceeds " + Integer . MAX_VALUE ) ; members . setStructureSize ( ( int ) header . recsize ) ; ArrayStructureBB structureArray = new ArrayStructureBB ( members , new int [ ] { recordRange . length ( ) } ) ; // note dependency on raf; should probably defer to subclass // loop over records byte [ ] result = structureArray . getByteBuffer ( ) . array ( ) ; int count = 0 ; for ( int recnum : recordRange ) { if ( debugRecord ) System . out . println ( " read record " + recnum ) ; raf . seek ( header . recStart + recnum * header . recsize ) ; // where the record starts if ( recnum != header . numrecs - 1 ) raf . readFully ( result , ( int ) ( count * header . recsize ) , ( int ) header . recsize ) ; else raf . read ( result , ( int ) ( count * header . recsize ) , ( int ) header . recsize ) ; // "wart" allows file to be one byte short. since its always padding, we allow count ++ ; } return structureArray ; }
Read data from record structure . For N3 this is the only possible structure and there can be no nesting . Read all variables for each record put in ByteBuffer .