Spring httpInvokerにおけるフロントバックグラウンドデータ圧縮伝送の試み

3407 ワード

目的:バックグラウンドでGZIPのフォーマットを使ってメモリの中のデータを圧縮して、フロントに転送して解凍しています
メカニズム:javaのGZIPInputStream
プロセス:
1:インタフェースを変更しbyte配列を返す
    
    /**
     *         bytes
     * **   
     * 
     * @return
     */
    public byte [] loadVOsBytes();

2:対応方法を修正し、転送したデータを圧縮する

    /**
     *         bytes
     * **   
     * 
     * @return
     */
    public byte[] loadVOsBytes() {

        //              
        FunVO[] vos = loadVOs();
        //   
        byte[] zipBytes = null;
        ByteArrayOutputStream byteOut;
        GZIPOutputStream gzout;
        ObjectOutputStream objectOut;
        try {
            //          
            byteOut = new ByteArrayOutputStream();
            //   gzip     
            gzout = new GZIPOutputStream(byteOut);
            //           
            objectOut = new ObjectOutputStream(gzout);
            objectOut.writeObject(vos);
            objectOut.flush();
            //         
            zipBytes = byteOut.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally {
            if (byteOut != null) {
                byteOut.close();
            }
            if (gzout != null) {
                gzout.close();
            }
            if (objectOut != null) {
                objectOut.close();
            }
        }
        return zipBytes;
    }

3:フロント対応の取得方法を修正し、解凍復元を行う
    
    /**
     *       (  )
     * @return
     */
    public FunVO[] getVOs() {

        if (vos == null) {
            byte[] zipBytes = login.loadVOsBytes();
            ByteArrayInputStream byteIn;
            GZIPInputStream gzIn;
            ObjectInputStream objectIn;
            try {
                //          
                byteIn = new ByteArrayInputStream(zipBytes);
                //   gzip     
                gzIn = new GZIPInputStream(byteIn);
                //           
                objectIn = new ObjectInputStream(gzIn);
                //                
                vos = (FunVO[]) objectIn.readObject();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } finally {
                if (byteIn != null) {
                    byteIn.close();
                }
                if (gzIn != null) {
                    gzIn.close();
                }
                if (objectIn != null) {
                    objectIn.close();
                }
            }
        }
        return vos;
    }

OK、ここまで来ると、転送されたデータは圧縮されています!
拡張:圧縮に失敗した場合、catchで異常をキャプチャし、圧縮を行わないbyte配列を返すには、インタフェースにフラグを追加して、クライアントに過圧縮を行ったかどうかを伝える必要があります.
拡張2:対応する圧縮と解凍方法はツールクラスに入れることができます.