根据取到文件的内容 生成二进制文件 并通过servlet获取

来源:互联网 发布:app美工设计招聘 编辑:程序博客网 时间:2024/06/06 03:16
无线那边需求需要,他们想从服务器上获取二进制文件 要我们给他们提供一个的接口


//生成二进制文件 到服务器端
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.ByteBuffer;
import java.text.SimpleDateFormat;
import java.util.BitSet;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;

import com.mapbar.traffic.util.CorpTrace;
import com.mapbar.traffic.util.PlatProperty;

/**
 * 生成实时路况数据文件Binary的工具类
 *
 *
 */
public class Binary {
    private static long lastModified = 0;  //全局文件最后更新时间缓存
   
    public static void main(String[] args) {
        deal();
    }

    public static void deal() {
        File f1 = new File("c:/test.txt");       //取文件内容1
        File f2 = new File("c:/test1.txt");      //取文件内容2
       
        BufferedReader br1 = null;
        BufferedReader br2 = null;
        DataOutputStream out = null;
        try {
            if (!f1.exists()) {
                throw new Exception("c:/test.txt is not Found!");
            } else if (!f2.exists()) {
                throw new Exception("c:/test1.txt is not Found!");
            }
            br1 = new BufferedReader(new FileReader(f1));
            br2 = new BufferedReader(new FileReader(f2));
            HashMap hs2 = new HashMap();
           
            long lm = f2.lastModified();  //最后更新时间戳
//            System.out.println(lastModified==lm);
            if(lastModified!=0){ 
                if(lastModified!=lm) {  //如果最后更新时间已经做了更新那么就重新生成文件。
//                    System.out.println("数据文件不一致!");
                    lastModified=lm;
                }else return;
            }else{
                lastModified=lm;
            }
//            System.out.println("test");
            String line2 = null;
            while ((line2 = br2.readLine()) != null) {
                if (!"".equals(line2.trim())) {
                    hs2.put(line2.split(",")[0], line2.split(",")[1] + ","
                            + line2.split(",")[2]);
                }
            }
            BitSet a;
            ByteBuffer bb = ByteBuffer.allocate(1024);二进制文件缓存buffer
            short city = Short.parseShort("1");//城市编码
            int pos = 0;
            bb.putShort(city);
            bb.putShort(Short.parseShort(String.valueOf((new Date()
                    .getMinutes() / 5))));
            pos = bb.position();
            bb.putShort((short) 0);

            String line1 = null;
            byte k = 0;
            byte l = 0;
            byte m = 0;
            byte n = 0;
            int count = 0;
            int count1 = 0;

            while ((line1 = br1.readLine()) != null) {
                count += 1;
                if (!"".equals(line1.trim())) {
                    String ss = (String) hs2.get(line1.split(",")[1]);
                    if (ss != null) {
                        String s = line1.split(",")[2];
                        String z = null;
                        if ("1".equals(s)) {
                            z = ss.split(",")[0];
                        } else if ("-1".equals(s)) {
                            z = ss.split(",")[1];
                        }
                        if (count == 1)
                            k = lukuang(z);
                        if (count == 2)
                            l = lukuang(z);
                        if (count == 3)
                            m = lukuang(z);
                        if (count == 4)
                            n = lukuang(z);
                    } else {
                        if (count == 1)
                            k = 0;
                        if (count == 2)
                            l = 0;
                        if (count == 3)
                            m = 0;
                        if (count == 4)
                            n = 0;
                    }
                }
                if (count == 4) {
                    //位运算 二进制文件加密
                    //n 左偏移6位  m左偏移4位 l左偏移2位 
                    byte ss = (byte) ((n << 6) + (m << 4) + (l << 2) + k);
                    bb.put(ss);
                    k = 0;
                    l = 0;
                    m = 0;
                    n = 0;
                    count = 0;
                }
                count1 += 1;
            }
            if (count < 4 && count > 0) {
                byte ss = (byte) ((n << 6) + (m << 4) + (l << 2) + k);
                bb.put(ss);
                k = 0;
                l = 0;
                m = 0;
                n = 0;
                count = 0;
            }
            out = new DataOutputStream(
                    new BufferedOutputStream(new FileOutputStream("c:/testBINARY.txt")));
            //生成二进制文件到本地服务器端
            int c = count1 % 4;
            if (c == 0)
                count1 = count1 / 4;
            else
                count1 = count1 / 4 + 1;
            bb.putShort(pos, (short) count1);
            out.write(bb.array(), 0, count1+6);
            CorpTrace.getLogger().info("已经生成Binary文件!");
        } catch (Exception ex) {
            CorpTrace.getLogger().error(
                    CorpTrace.formatMessage(
                            "Failed to get realtime data from yootu!", ex,
                            CorpTrace.PRINTSTACK));
        } finally {
            try {
                if (br1 != null)
                    br1.close();
                if (br2 != null)
                    br2.close();
                if (out != null)
                    out.close();
            } catch (IOException e) {}
        }
    }

    public static byte lukuang(String s) {
        if ("A".equals(s)) {
            return 1;
        } else if ("B".equals(s)) {
            return 2;
        } else if ("C".equals(s)) {
            return 3;
        } else
            return 0;
    }
}

//一个servlet 从服务器端取这个二进制文件。
import java.io.File;
import java.io.RandomAccessFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.*;
import com.mapbar.traffic.util.CorpTrace;
import com.mapbar.traffic.util.PlatProperty;

public class BinaryServlet extends HttpServlet {
    public void doGet(HttpServletRequest httpservletrequest,
            HttpServletResponse response) {
        try {
            File f1 = new File(PlatProperty.UTBINARY_FILE);
            if (f1.exists()) {
                RandomAccessFile rafData = new RandomAccessFile(f1, "r");

                byte[] __buffer = new byte[(int) rafData.length()];

                rafData.seek(0);
                rafData.read(__buffer, 0, __buffer.length);
                rafData.close();

                response.setHeader("Server", "MapbarServer");
                response.setHeader("Content-length", "" + __buffer.length);
                ServletOutputStream so = response.getOutputStream();
                if (__buffer != null) {
                    so.write(__buffer);
                    so.close();
                } else {
                    // out.println("ERR");
                }
            }
        } catch (Exception ex) {
            CorpTrace.getLogger().error(
                    CorpTrace.formatMessage("Failed to convert latlon!", ex,
                            CorpTrace.PRINTSTACK));
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) {
        doGet(request, response);
    }
}
原创粉丝点击