docs: private void read_block_sizes_from_cache(long cache_end)
      throws IOException
      {
          int block_size;
          long block_address;
          ByteArrayInputStream bis;
          byte[] buf;
          long cache_cursor;
          DataInputStream dis;
          int list_index;
  
          buf = new byte[(int) (cache_end - tail_ptr)];
          seek(tail_ptr);
          read(buf);
          bis = new ByteArrayInputStream(buf);
          dis = new DataInputStream(bis);
          allocated_blocks = dis.readLong();
          allocated_words = dis.readLong();
          free_blocks = 0;
          free_words = 0;
          cache_cursor = tail_ptr + (2*LONG_SIZE);
          while (cache_cursor < cache_end) {
              list_index = dis.readInt();
              block_address = dis.readLong();
              cache_cursor += INT_SIZE + PTR_SIZE;
              while (block_address != DISK_NULL) {
                  block_size = dis.readInt();
                  add_new_block_to_freelist(block_address, block_size,
                                            list_index);
                  block_address = dis.readLong();
                  cache_cursor += INT_SIZE + PTR_SIZE;
              }
          }
          dis.close();
          bis.close();
          if (!readOnly) {
              seek(CACHE_END);
              writeLong(DISK_NULL);
          }
          fast_startups++;
      }