code: public static SObject of(String key, InputStream is) {
          try {
              return new InputStreamSObject(key, $.requireNotNull(is));
          } catch (Exception e) {
              return getInvalidObject(key, e);
          }
      }
docs: Construct an SObject with key and input stream. Note unlike sobject
  constructed with String, byte array or file, the sobject constructed
  with input stream can only be read for one time. If the program
  tries to access the Sobject the second time, it will encountered an
  {@link UnexpectedIOException}. Another limit of this sobject is it
  does not support {@link org.osgl.storage.ISObject#getLength()} method
  <p>
  <p>If it needs to construct an SObject without these limits from
  an input stream, then it shall first read the inputstream into
  a bytearray, and use the byte array to construct the sobject like
  following code</p>
  <p>
  <pre><code>
  InputStream is = ...
  ...
  ISObject sobj = SObject.of(IO.readContent(is))
  </code><pre>