软通大学企业博客

北京软通动力教育科技有限公司

JAVA实现内存对象和字符串的互转(非BASE64和json)

JAVA实现内存对象和字符串的互转(非BASE64和json)

在很多地方,我们仍然需要纯字符串来进行数据的保存和传递、例如cookie、radis缓存等、这时如何将对象保存为对应的字符串形式就迫切需要了。有人可能会说用json就可以了,但我如果要存张图片呢?

思路如下

  1. 获得内存对象的字节数组
  2. 将其重组为ISO-8859-1标准字符集的字符数组,刚好都是一一对应的
  3. 这个字符串想保存在哪里都可以,文件、缓存等。
  4. 使用时需将字符串读入
  5. 再将字符串转成字节数组
  6. 再将字节数组还原为对象

开撕代码,注释比较明确,自己看吧。已经实现了对象(需实现序列化接口)和字符串互转、图像和字符串互转。


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author TeacherXue
 * @date 2018年5月17日 下午5:13:01
 * @file com.issCollege.shop.entity ObjToStr.java
 * @version V1.0
 */
public class ObjToStr {
    /**
     * 测试用主方法
     * @param args
     */
    public static void main(String[] args) {
        List<String> ls=new ArrayList<String>();
        ls.add("张无忌");
        ls.add("旺财");
        ls.add("拉布拉多");
        ls.add("伦敦");

        System.out.println("-----------list对象toString-----------");
        System.out.println("list对象:"+ls);
        System.out.println("-----------list的字符串形式-----------");
        String s=ObjToStr.getByteString(ls);
        System.out.println(s);
        System.out.println("-----------字符串还原为对象-----------");
        List<String> list=(List<String>) ObjToStr.getObj(s);
        System.out.println("list对象:"+list);

        String imgStr = ObjToStr.getImgStr(new File("src/s2.png"));
        System.out.println("-----------图片的字符串形式-----------");
        System.out.println(imgStr);
        File f = ObjToStr.generateImage(imgStr, new File("d:/myPic.png"));
        System.out.println("文件存于:"+f.getAbsolutePath());

    }

    /**
     * 序列化方法,获得内存对象的ISO-8859-1字符串形式
     * 
     * @param o
     *            转换对象,该对象必须实现序列化序列
     * @return
     */
    public static String getByteString(Object o) {
        String str = "";
        try {
            // 字节数组输出流对象
            ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
            // 对象输出流对象
            ObjectOutputStream objOut = new ObjectOutputStream(byteOut);
            // 将传入的内存对象通过对象流写入字节数组
            objOut.writeObject(o);
            // 获得对象的ISO-8859-1字符串形式,这里只能使用ISO-8859-1
            str = byteOut.toString("ISO-8859-1");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return str;
    }

    /**
     * 反序列化方法,根据对象的字符串表现形式获得内存对象
     * 
     * @param s
     *            对象的字符串数组
     * @return
     */
    public static Object getObj(String s) {
        Object obj = null;
        try {
            // 将传入的对象字符串表现转为字节数组输入流
            ByteArrayInputStream byteIn = new ByteArrayInputStream(s.getBytes("ISO-8859-1"));
            // 字节数组输入流包装成对象输入流
            ObjectInputStream objIn = new ObjectInputStream(byteIn);
            // 让当前对象输入流读入一个对象
            obj = objIn.readObject();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return obj;
    }

    /**
     * 图片的序列化方法,获得图片的字符串形式
     * 
     * @param imgFile
     *            图片文件对象
     * @return ISO-8859-1字符串
     */
    public static String getImgStr(File imgFile) {
        String str = "";
        try {
            FileInputStream fi = new FileInputStream(imgFile);
            // 根据文件输入流得到图片文件字节数创建字节数组
            byte[] b = new byte[fi.available()];
            // 将图片文件读入字节数组
            fi.read(b);
            fi.close();
            // 将图片的字节数组实例化成字符数组,这里只能用ISO-8859-1标准字符集
            str = new String(b, "ISO-8859-1");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return str;
    }

    /**
     * 图片的返序列化方法
     * 
     * @param imgStr
     *            图片的字符串
     * @param f
     *            生成的图片对象
     * @return
     */
    public static File generateImage(String imgStr, File f) {

        Object obj = null;
        try {
            // 获得图片字符串的字节数组输入流
            ByteArrayInputStream byteIn = new ByteArrayInputStream(imgStr.getBytes("ISO-8859-1"));

            // 用于图片文件输出的的文件输出流
            FileOutputStream fo = new FileOutputStream(f);
            // 创建读取图片的字节数组
            byte[] b = new byte[byteIn.available()];

            // 读入图片字符串到字节数组
            byteIn.read(b);
            byteIn.close();

            // 将字节数组写入图片文件
            fo.write(b);
            fo.flush();
            fo.close();

        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return f;
    }

}

Created by 薛萌
这里写图片描述

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/isscollege/article/details/80354925
个人分类: java
想对作者说点什么? 我来说一句

jsonjava对象互转

2012年06月26日 5KB 下载

没有更多推荐了,返回首页

不良信息举报

JAVA实现内存对象和字符串的互转(非BASE64和json)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭