- Part 3 - Reading and writing:
  - Now lets add methods so we can read/write data in the file. For this we are going to follow what `DataFile` is doing and add three methods (you will see why in Lab 2).
  - `getDataBuffer(..)`
    - This will return a data buffer that the user can use when reading/writing this file. Here we can just mimic what `DataFile` is doing.

            public Data getDataBuffer (int size) {
              return new Data(getFormat(), size);
            }

  - `read(..)`
    - The `read(..)` method is relatively short, but it can be a bit confusing the first time. So we will just use the code below and then explain what is happening line-by-line.

            public int read (Data data, int elements) {
              int bytes     = elements * BPE;                // 1
              int bytesRead = read(data.getBuf(), 0, bytes); // 2
              int numRead   = bytesRead / BPE;               // 3
                                                             // 4
              if (Shell.rep != EEEI) {                       // 5
                Convert.rep(data.getBuf(), 0, getFormat(),   // 6
                            numRead, EEEI, Shell.rep);       // 7
              }                                              // 8
              return numRead;                                // 9
            }

      - Line 1: Convert from number of elements to number of bytes.
      - Line 2: Read bytes from the file and insert them directly in to the data buffer (`data.getBuf()` accesses the raw byte array). The method being called was provided by `BaseFile` and reads raw bytes from the file.
      - Line 3: Convert from number of bytes actually read to number of elements.
      - Lines 5-8: If the data we just read in (little-endian, `EEEI`) does not match the data representation of the local host system, we need to convert it to match. The `Convert.rep(..)` method will do that for us.
      - Line 9: Return the number of elements read in.
  - `write(..)`
    - The `write(..)` method is similar to the `read(..)` method.

            public int write (Data data, int elements) {
              if (Shell.rep != EEEI) {
                Convert.rep(data.getBuf(), 0, getFormat(), elements, Shell.rep, EEEI);
              }

              int bytes      = elements * BPE;
              int numWritten = write(data.getBuf(), 0, bytes);
              return numWritten / BPE;
            }

- continued on next page