当前位置: 首页 > 工具软件 > Jackcess > 使用案例 >

Jackcess MDB文件数据获取和HttpClients的简单使用

漆雕兴平
2023-12-01

前情回顾: Jackcess 海量数据的.mdb文件快速生成

前言

上次写了使用Jackcess生成MDB文件,这次让我自己对接,使用生成的mdb文件,进行数据导入(导入到不同的库)。
分解一下大概就算

  1. 从mdb文件取得数据
  2. 导入数据库
    其中,第一点就是这次要写的,有写怎么能没有读呢

一、读取解析access文件 代码

由于是另外的接口,mdb文件就只能使用上传的方式获取,上传就不说了,直接就是接收的参数为@RequestBody MultipartFile mdbFile,这样,我们需要读取的文件格式为File,
所以流程就变成了

  1. MultipartFile转为File
  2. 使用File配合方法读取mdb文件里的数据

其中有个坑就是之前打开的数据库用完没close,导致缓存的文件一致删不掉

    /**
     * 读取解析access文件 - MultipartFile
     * @param multipartFile
     * @return
     */
    @SuppressWarnings({"unchecked"})
    public static List<Map> readFileACCESS(MultipartFile multipartFile) throws IOException {
        // MultipartFile 转为File
        File mdbFile =null;
        mdbFile =  transferToFile(multipartFile);


        List<Map> maplist = new ArrayList();
        try {
            if (mdbFile.exists()) {
                Database dbin = null;
//                dbin = Database.open(mdbFile);//读文件
                dbin = DatabaseBuilder.open(mdbFile);
                Set<String> tables = dbin.getTableNames();
                for (String t : tables) {//遍历所有表名
                    Map mapTable = new HashMap();
                    mapTable.put("tableName", t);
                    Table table = dbin.getTable(t); //获取对应表结构
                    List<Map> list = new ArrayList();
                    for (Map<String, Object> map : table) {//遍历表数据
                        list.add(map);
                    }
                    mapTable.put("data", list);
                    maplist.add(mapTable);
                }
                // 注意关闭,不然会导致缓存文件无法删除
                dbin.close();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        // 删除缓存文件
        File del = new File(mdbFile.getPath());
        del.delete();
        return maplist;
    }

依赖的两个方法

    /**
     * 通过流写入文件
     * @param ins
     * @param file
     */
    public static void inputStreamToFile(InputStream ins, File file) {
        try {
            OutputStream os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            ins.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * file 转换为 MultipartFile
     * @param file
     * @return
     * @throws IOException
     */
    private static File transferToFile(MultipartFile file) throws IOException {
        File f = null;
        if(file.equals("")||file.getSize()<=0){
            file = null;
        }else{
            InputStream ins = file.getInputStream();
            f=new File(file.getOriginalFilename());
            inputStreamToFile(ins, f);
        }
        return f;
    }

拿到数据,结束

二、 HttpClients的简单使用

直接上代码

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.UUID;

public class httpClientTest {
    public static void main(String[] args) throws Exception {

    }

    public String autoexec(String ip,String tableName, String accessToken) throws URISyntaxException, IOException {
        // 创建Httpclient对象
        CloseableHttpClient httpclient = HttpClients.createDefault();
        // 定义请求的参数
        URI uri = new URIBuilder(String.format("http://%s/resource/rest/business-data-downloads/download/%s", ip, tableName))
                .setParameter("access_token", accessToken)
                .build();
        // 创建http GET请求
        HttpGet httpGet = new HttpGet(uri);
        //response 对象
        CloseableHttpResponse response = null;
        try {
            // 执行http get请求
            response = httpclient.execute(httpGet);
            // 判断返回状态是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
                // 使用这个方法,生产的mdb文件大小会变大,而且莫名奇妙多了个密码
//                String content = EntityUtils.toString(response.getEntity(), "UTF-8");
                InputStream inputStream = response.getEntity().getContent();
                //内容写入文件
                String fileUrl = generateFile(inputStream, System.getProperty("java.io.tmpdir"), String.format("[临时文件]%s", UUID.randomUUID()), ".mdb");
                return fileUrl;
            } else {
                System.out.println(String.format("获取失败,结果码为:%s, 具体的错误信息为:%s", response.getStatusLine().getStatusCode(), EntityUtils.toString(response.getEntity())));
                return null;
            }
        } finally {
            if (response != null) {
                response.close();
            }
            httpclient.close();
        }
    }

    /**
     * 文件生成
     *
     * @param is     文件流的数据
     * @param path     文件基础路径
     * @param filename 文件名
     * @param suffix   文件后缀
     * @return
     */
    public static String generateFile(InputStream is, String path, String filename, String suffix) {
        FileWriter writer;
        String fileurl = path + File.separator + filename + suffix;
        try {
            BufferedInputStream in=null;
            BufferedOutputStream out=null;
            in=new BufferedInputStream(is);
            out=new BufferedOutputStream(new FileOutputStream(fileurl));
            int len=-1;
            byte[] b=new byte[1024];
            while((len=in.read(b))!=-1){
                out.write(b,0,len);
            }
            in.close();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return fileurl;
    }

}

三、参考资料

  1. java 获取临时目录
 类似资料: