@Override
    public void loadModel(InputStream modelIs) {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            IOUtils.copy(modelIs, baos);
        } catch (IOException e) {
            LOG.error("Load model err.", e);
        }

        InputStream isForSVMLoad = new ByteArrayInputStream(baos.toByteArray());
        try (ZipInputStream zipInputStream = new ZipInputStream(isForSVMLoad)) {
            ZipEntry entry;
            while ((entry = zipInputStream.getNextEntry()) != null) {
                if (entry.getName().endsWith(".model")) {
                    BufferedReader br = new BufferedReader(new InputStreamReader(zipInputStream, Charset.defaultCharset()));
                    this.model = svm.svm_load_model(br);
                }
            }

        } catch (IOException e) {
            // Do Nothing.
        }

        modelIs = new ByteArrayInputStream(baos.toByteArray());
        try (ZipInputStream zipInputStream = new ZipInputStream(modelIs)) {
            ZipEntry entry;
            while ((entry = zipInputStream.getNextEntry()) != null) {
                if (entry.getName().endsWith(".lbindexer")) {
                    String lbIndexer = IOUtils.toString(zipInputStream, Charset.defaultCharset());
                    this.labelIndexer = new LabelIndexer(new ArrayList<>());
                    this.labelIndexer.readFromSerializedString(lbIndexer);
                }
            }

        } catch (IOException e) {
            LOG.error("Err in load LabelIndexer", e);
        }

    }
@ Override public void loadModel ( InputStream modelIs ) { ByteArrayOutputStream baos = new ByteArrayOutputStream ( ) ; try { IOUtils . copy ( modelIs , baos ) ; } catch ( IOException e ) { LOG . error ( "Load model err." , e ) ; } InputStream isForSVMLoad = new ByteArrayInputStream ( baos . toByteArray ( ) ) ; try ( ZipInputStream zipInputStream = new ZipInputStream ( isForSVMLoad ) ) { ZipEntry entry ; while ( ( entry = zipInputStream . getNextEntry ( ) ) != null ) { if ( entry . getName ( ) . endsWith ( ".model" ) ) { BufferedReader br = new BufferedReader ( new InputStreamReader ( zipInputStream , Charset . defaultCharset ( ) ) ) ; this . model = svm . svm_load_model ( br ) ; } } } catch ( IOException e ) { } modelIs = new ByteArrayInputStream ( baos . toByteArray ( ) ) ; try ( ZipInputStream zipInputStream = new ZipInputStream ( modelIs ) ) { ZipEntry entry ; while ( ( entry = zipInputStream . getNextEntry ( ) ) != null ) { if ( entry . getName ( ) . endsWith ( ".lbindexer" ) ) { String lbIndexer = IOUtils . toString ( zipInputStream , Charset . defaultCharset ( ) ) ; this . labelIndexer = new LabelIndexer ( new ArrayList < > ( ) ) ; this . labelIndexer . readFromSerializedString ( lbIndexer ) ; } } } catch ( IOException e ) { LOG . error ( "Err in load LabelIndexer" , e ) ; } }
We load twice because svm.svm_load_model will close the stream after load. so the next guy will have Steam closed exception.