前情回顾: Jackcess 海量数据的.mdb文件快速生成
上次写了使用Jackcess生成MDB文件,这次让我自己对接,使用生成的mdb文件,进行数据导入(导入到不同的库)。
分解一下大概就算
由于是另外的接口,mdb文件就只能使用上传的方式获取,上传就不说了,直接就是接收的参数为@RequestBody MultipartFile mdbFile,这样,我们需要读取的文件格式为File,
所以流程就变成了
其中有个坑就是之前打开的数据库用完没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;
}
拿到数据,结束
直接上代码
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;
}
}