private void writeVersionNeededToExtractAndGeneralPurposeBits(
      final int zipMethod, final boolean utfFallback, final boolean zip64) throws IOException {

    // CheckStyle:MagicNumber OFF
    int versionNeededToExtract = INITIAL_VERSION;
    GeneralPurposeBit b = new GeneralPurposeBit();
    b.useUTF8ForNames(useUTF8Flag || utfFallback);
    if (zipMethod == DEFLATED && raf == null) {
      // requires version 2 as we are going to store length info
      // in the data descriptor
      versionNeededToExtract = DATA_DESCRIPTOR_MIN_VERSION;
      b.useDataDescriptor(true);
    }
    if (zip64) {
      versionNeededToExtract = ZIP64_MIN_VERSION;
    }
    // CheckStyle:MagicNumber ON

    // version needed to extract
    writeOut(ZipShort.getBytes(versionNeededToExtract));
    // general purpose bit flag
    writeOut(b.encode());
  }