code: public static Normalizer2 getInstance(InputStream data, String name, Mode mode) {
          // TODO: If callers really use this API, then we should add an overload that takes a ByteBuffer.
          ByteBuffer bytes = null;
          if (data != null) {
              try {
                  bytes = ICUBinary.getByteBufferFromInputStreamAndCloseStream(data);
              } catch (IOException e) {
                  throw new ICUUncheckedIOException(e);
              }
          }
          Norm2AllModes all2Modes=Norm2AllModes.getInstance(bytes, name);
          switch(mode) {
          case COMPOSE: return all2Modes.comp;
          case DECOMPOSE: return all2Modes.decomp;
          case FCD: return all2Modes.fcd;
          case COMPOSE_CONTIGUOUS: return all2Modes.fcc;
          default: return null;  // will not occur
          }
      }
docs: Returns a Normalizer2 instance which uses the specified data file
  (an ICU data file if data=null, or else custom binary data)
  and which composes or decomposes text according to the specified mode.
  Returns an unmodifiable singleton instance.
  <ul>
  <li>Use data=null for data files that are part of ICU's own data.
  <li>Use name="nfc" and COMPOSE/DECOMPOSE for Unicode standard NFC/NFD.
  <li>Use name="nfkc" and COMPOSE/DECOMPOSE for Unicode standard NFKC/NFKD.
  <li>Use name="nfkc_cf" and COMPOSE for Unicode standard NFKC_CF=NFKC_Casefold.
  </ul>
  If data!=null, then the binary data is read once and cached using the provided
  name as the key.
  If you know or expect the data to be cached already, you can use data!=null
  for non-ICU data as well.
  <p>Any {@link java.io.IOException} is wrapped into a {@link android.icu.util.ICUUncheckedIOException}.
  @param data the binary, big-endian normalization (.nrm file) data, or null for ICU data
  @param name "nfc" or "nfkc" or "nfkc_cf" or name of custom data file
  @param mode normalization mode (compose or decompose etc.)
  @return the requested Normalizer2, if successful