zoukankan      html  css  js  c++  java
  • 处理 json数据,base64合成图片

    Main.java

    package cleandata;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.util.concurrent.LinkedBlockingQueue;
    
    
    public class Main {
        
        public static void main(String args[]) throws Exception{
            
            LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>();        
            //线程数量
            int threadnum = 10;        
            for(int i = 0; i < threadnum; i++) {
                CleandataRunnable r = new CleandataRunnable(queue, "r" + i);
                r.start();
            }
            
            findfile(queue);
        }
        
        public static void findfile(LinkedBlockingQueue<String> queue) throws Exception {
    
            final String dirPath = "/home/tqhy/json-data";    
            File f = new File(dirPath);
            File[] fs = f.listFiles();
            
            int count = 0;
            
            BufferedReader reader = null;
            String str = null;
            
            try {
                for(File file:fs) {    //file:  D:	est3f008a67753f44496647c30d46a635cf.json
                    if(file.getName().endsWith(".json")) {
                        reader = new BufferedReader(new FileReader(file));                    
                        while((str=reader.readLine()) != null) {
                            queue.put(str);
                             if (queue.size() > 500) {
                                 System.out.println("queue is full,wait 1000 ms");
                                 Thread.sleep(1000);
                            }
                            count++;
                            System.out.println("all count: " + count);
                            //System.out.println("all count:" + count + " queue's number:" + queue.size());
                        }
                        System.out.println("read over" + file.getName());
                        reader.close();
                    }
                }
                
            } catch (Exception e) {}
        }
        
        
    /*    public static void findfile1 (LinkedBlockingQueue queue) throws Exception {
            CleandataRunnable r1 = new CleandataRunnable(queue,"r1");
            CleandataRunnable r2 = new CleandataRunnable(queue,"r2");
            CleandataRunnable r3 = new CleandataRunnable(queue,"r3");
            CleandataRunnable r4 = new CleandataRunnable(queue,"r4");
            r1.start();
            r2.start();
            r3.start();
            r4.start();
            
            String dirPath = "D:\test";
            File f = new File(dirPath);
            File[] fs = f.listFiles();
            int count=0;
            for(File file:fs) {    //file:  D:	est3f008a67753f44496647c30d46a635cf.json
                System.out.println(file);
                if(file.getName().endsWith(".json")) {
                    queue.put(file);
                
                }
                
            }
            
            
        }*/
        
    }
    package cleandata;
    
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.concurrent.LinkedBlockingQueue;
    
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    
    import redis.clients.jedis.Jedis;
    
    public final class CleandataRunnable extends Thread {
        private String threadName;
        LinkedBlockingQueue<?> queue;
        
        //write category file path
        static final String FILEPATH = "/home/tqhy/yl/category/";
        
        //write image path
        static final String IMAPATH = "/home/tqhy/yl/img/";
        
        Jedis jedis = new Jedis("127.0.0.1", 6379);
    
        CleandataRunnable(LinkedBlockingQueue<?> queue, String name) {
            this.queue = queue;
            threadName = name;
            System.out.println("Creating " + threadName);
        }
    
        @Override
        public void run() {
            System.out.println("Running " + threadName);        
            FileUtil.createFile(FILEPATH);
            //Jedis jedis = new Jedis("127.0.0.1", 6379);
            try {    
                while (true) {
                    long startTime = System.currentTimeMillis();// current time
                    //long startMem = Runtime.getRuntime().freeMemory();
                    JSONObject jsondata = JSONObject.parseObject((String) queue.take());
                    /**
                     * 排除分类3空项
                     */
                    String category3 = jsondata.get("category3").toString();
                    if(category3.length() <= 0) {
                        System.out.println("category3为空 id: " + jsondata.get("id"));
                        continue;
                    }
                    /**
                     * 验证图片
                     */
                    JSONArray images = JSONArray.parseArray(jsondata.get("images").toString());
                    JSONArray newimages = new JSONArray();
                    for (int i = 0, len=images.size();i < len; i++) {
                        
                        String base64 = images.getJSONObject(i).getString("base64");
                        String id = images.getJSONObject(i).getString("id");
                        
                        String tmpPath = ImgUtil.GenerateImage(base64, id, IMAPATH + jsondata.getString("id"));// 合成图片
                            
                        if(tmpPath != null) {
                            JSONObject imageinfo = new JSONObject();
                            imageinfo.put("tmpPath", tmpPath);
                            imageinfo.put("id", id);
                            newimages.add(imageinfo);
                        }
                        
                    }
                    /**
                     * 排除图片不合格项
                     */
                    if(newimages.size() == 0)
                    {
                        System.out.println("没有图片 id: " + jsondata.get("id"));
                        continue;
                    }
                    
                    jsondata.put("images", newimages);
                    /**
                     * 新json写进分类文件
                     */
                    FileWriter writer = new FileWriter(FILEPATH + category3 + ".json", true);
                    writer.write(jsondata.toJSONString());
                    writer.write(System.getProperty("line.separator"));
                    writer.close();
                    /**
                     * 分类放redis里
                     */
                    setObject(category3, jedis);
                    
                    long endTime = System.currentTimeMillis();
                    //long endMem = Runtime.getRuntime().freeMemory();
                    System.out.println("程序运行时间:" + (endTime - startTime) + "ms   " + threadName);// + "  Use memory: "+ (startMem - endMem));// + " nowTime" + new Date());    
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
        
        /**
         * 分类存入redis,计数器
         * @param category
         * @param jedis
         */
        public void setObject(String category,Jedis jedis) {
            
            if (jedis.get(category) == null) {
                jedis.set(category, "1");
            } else {
                int count = Integer.parseInt(jedis.get(category));
                count++;
                jedis.set(category, String.valueOf(count));
            }
        }
        
    /*    public void run() {
            System.out.println("Running " + threadName);
            
            try {
                while (queue.isEmpty()) {
                    Thread.currentThread().sleep(10);
                }
            } catch (InterruptedException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            
            // 写入文件地址
            //final String filePath = "D:\test1\category\";
            File sf = new File(FILEPATH);
            if (!sf.exists()) {
                sf.mkdirs();
            }
            
            // 存入图片地址
            //final String imgPath = "D:\test1\img\";
            
            Jedis jedis = new Jedis("127.0.0.1", 6379);
            
            String category3=null;
            //String Eid=null;
            String base64=null;
            String id=null;
            //String imagePath=null;
            String tmpPath=null;
            //String catePath=null;
            JSONObject jsondata=null;
            long startTime=0;
            long endTime=0;
            JSONArray images=null;
            //boolean verify = true;
            JSONArray newimages=null;
            JSONObject imageinfo=null;
            String content=null;
            FileWriter writer=null;
            //File tmpimage=null;
            FileInputStream fi=null;
            //BufferedImage sourceImg=null;
            //int picWidth=0;
            while (!queue.isEmpty()) {
    
                try {
                    startTime = System.currentTimeMillis();// 获取当前时间
                    jsondata = (JSONObject) queue.take();
    
                    images = JSONArray.parseArray(jsondata.get("images").toString());
                    newimages = new JSONArray();
                    //Eid = jsondata.getString("id"); // 商品ID
                    //verify = true;
                    // 图片合成、转存
                    for (int i = 0; i < images.size(); i++) {
    
                        base64 = images.getJSONObject(i).getString("base64");
                        id = images.getJSONObject(i).getString("id");
                        //imagePath = IMAPATH + Eid;
    
                        tmpPath = GenerateImage(base64, id, IMAPATH + jsondata.getString("id"));// 合成图片
                        // 验证图片
                        //tmpimage = new File(tmpPath);
                        fi = new FileInputStream(new File(tmpPath));
                        //sourceImg = ImageIO.read(fi);
                        //picWidth = ImageIO.read(fi).getWidth();
                        if (ImageIO.read(fi).getWidth() < 0) {
                            //verify = false;
                            System.out.println("图片损坏:" + tmpPath);
                            continue;
                        }
                        fi.close();
    
                        imageinfo = new JSONObject();
                        imageinfo.put("tmpPath", tmpPath);
                        imageinfo.put("id", id);
                        newimages.add(imageinfo);
    
                    }
                    category3 = jsondata.get("category3").toString();
                    //if (verify == true) {
                        jsondata.put("images", newimages);
                        content = jsondata.toJSONString();
                        // 当前分类文件地址
                        
                        //catePath = FILEPATH + category3 + ".json";
                        writer = new FileWriter(FILEPATH + category3 + ".json", true);
                        writer.write(content);
                        writer.write(System.getProperty("line.separator"));
                        writer.close();
                        setObject(category3,jedis);// 分类放redis里
                    //}
                    endTime = System.currentTimeMillis();
                    System.out.println(
                            "程序运行时间:" + (endTime - startTime) + "ms   " + threadName + " 处理category3:" + category3);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
    
            }
    
        }*/
    
        /**
         * 放文件进队列,所以处理的是文件
         * 
         * @param category
         */
        // @Override
        /*
         * public void run1(){ System.out.println("Running "+threadName); while(true) {
         * try { File file = (File) queue.take(); BufferedReader reader = new
         * BufferedReader(new FileReader(file)); String str; int count=0; //存入图片地址
         * String imgPath = "D:\test1\img\"; //写入文件地址 String filePath =
         * "D:\test1\category\"; File sf = new File(filePath); if (!sf.exists()) {
         * sf.mkdirs(); } while((str=reader.readLine())!=null) { JSONObject jsondata =
         * JSONObject.parseObject(str); String category3 =
         * jsondata.get("category3").toString(); if(category3.length()>0) {
         * 
         * count++;
         * System.out.println("count:"+count+"  当前分类:"+jsondata.get("category3").
         * toString()+"threadName:"+threadName); JSONArray images =
         * JSONArray.parseArray(jsondata.get("images").toString()); JSONArray newimages
         * = new JSONArray(); String Eid=jsondata.getString("id"); //商品ID boolean
         * verify=true; //图片合成、转存 for(int i=0;i<images.size();i++) {
         * 
         * String base64=images.getJSONObject(i).getString("base64"); String
         * id=images.getJSONObject(i).getString("id"); String imagePath = imgPath+Eid;
         * 
         * String tmpPath=GenerateImage(base64,id,imagePath);//合成图片 //验证图片 File tmpimage
         * = new File(tmpPath); FileInputStream fi = new FileInputStream(tmpimage);
         * BufferedImage sourceImg =ImageIO.read(fi); int picWidth=
         * sourceImg.getWidth(); if(picWidth<0) { verify=false;
         * System.out.println("图片损坏:"+tmpPath); } fi.close();
         * 
         * JSONObject imageinfo = new JSONObject(); imageinfo.put("tmpPath", tmpPath);
         * imageinfo.put("id", id); newimages.add(imageinfo);
         * 
         * }
         * 
         * if(verify==true) { jsondata.put("images", newimages); String
         * content=jsondata.toJSONString(); //当前分类文件地址 String catePath =
         * filePath+category3+".json"; FileWriter writer = new FileWriter(catePath,
         * true); writer.write(content);
         * writer.write(System.getProperty("line.separator")); writer.close();
         * setObject(category3);//分类放redis里 } } } reader.close();
         * 
         * } catch (InterruptedException e) { // TODO Auto-generated catch block
         * e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
         * 
         * }
         */
        
        
        
    }
    package cleandata;
    
    import java.io.File;
    
    public final class FileUtil {
        /**
         * 文件夹是否存在,不存在创建
         * @param path
         */
        public static void createFile(String path) {
            File file = new File(path);
            if (!file.exists()) {
                file.mkdirs();
            }
        }
    }
    package cleandata;
    
    import java.io.ByteArrayInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.Iterator;
    
    import javax.imageio.ImageIO;
    import javax.imageio.ImageReader;
    import javax.imageio.stream.ImageInputStream;
    import javax.imageio.stream.MemoryCacheImageInputStream;
    
    import sun.misc.BASE64Decoder;
    
    public final class ImgUtil {
        /**
         *  base64字符合成图片
         * @param imgStr
         * @param id
         * @param path
         * @return
         */
        public static String GenerateImage(String imgStr, String id, String path) {
    
                FileUtil.createFile(path);
                
                // 图像数据为空
                if (imgStr == null)
                    return null;
                //BASE64Decoder decoder = new BASE64Decoder();
    
                try {
                    // Base64解码
                    byte[] b = new BASE64Decoder().decodeBuffer(imgStr);
                    
                    //判断文件大小,格式是否符合要求
                    if(!checkSize(b))
                    {
                        System.out.println("图片大小不符合要求"+path+ "/" + id);
                        return null;
                    }
                        
                    if(!verifyJPG(b))
                    {
                        System.out.println("图片格式不是jpg");
                        return null;
                    }                    
                    
                    for (int i = 0,len=b.length; i < len; ++i) {
                        if (b[i] < 0) {// 调整异常数据
                            b[i] += 256;
                        }
                    }
    
                    // 生成jpg图片
                    String imgFilePath = path + "/" + id + ".jpg";
                    OutputStream out = new FileOutputStream(imgFilePath);
                    out.write(b);
                    out.flush();
                    out.close();
                    
                    //判断图片能否打开
                    FileInputStream fi = new FileInputStream(new File(imgFilePath));
                    if(ImageIO.read(fi) == null)
                    {
                        fi.close();
                        System.out.println("图片打不开");
                        return null;
                    }                    
                    fi.close();
                    return imgFilePath;
                    
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
            }
        
        /**
         * 校验格式是否为jpeg
         * @param bytes
         * @return
         */
        public static boolean verifyJPG(byte[] bytes) {
            String suffix = null;
            try {            
                ImageInputStream imageInputstream = new MemoryCacheImageInputStream(new ByteArrayInputStream(bytes));
                 //不使用磁盘缓存
                ImageIO.setUseCache(false);
                Iterator<ImageReader> it = ImageIO.getImageReaders(imageInputstream);
                if (it.hasNext()) {
                    ImageReader imageReader = it.next();
                    suffix = imageReader.getFormatName().trim().toLowerCase();                 
                }
            }catch (IOException e) {
                e.printStackTrace();
            }
            //System.out.println("suffix: " + suffix);
            return suffix.equals("jpeg");
        }
        
        /**
         * 校验文件大小
         *
         * @param
         * @return
         */
        public static boolean checkSize(byte[] bytes) {
            //符合条件的照片大小(可配置) 单位:M
            double imgSize = 0.002;
            //图片转base64字符串一般会大,这个变量就是设置偏移量。可配置在文件中,随时修改。目前配的是0。后续看情况适当做修改
            double deviation = 0.0;
            int length = bytes.length;
            //原照片大小
            double size = (double) length / 1024 / 1024 * (1 - deviation);
            //System.out.println("照片大小为:" + size + "M");
            return size > imgSize;
        }
    }
  • 相关阅读:
    widget的进一步使用,利用AppWidgetProvider实现桌面的时钟挂件
    opengl绘图,画一个旋转的四边形和一个旋转的三角形,平滑着色和单一着色
    opengl se画图
    绘制立方体和单个的矩阵,并映射纹理图像
    opengl的坐标和glFrustumf的设定及参数相关意义
    glDrawElements 和glDrawArrays
    spring mvc的拦截器
    spring mvc 文件上传
    spring mvc返回json字符串的方式
    springmvc的数据校验
  • 原文地址:https://www.cnblogs.com/lely/p/10316194.html
Copyright © 2011-2022 走看看