通过url下载zip对账单文件,进行解压,读取压缩文件内容。
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; import java.net.URL;
import java.net.URLConnection; import java.text.SimpleDateFormat; import java.util.Date; import com.alipay.downOrdession.*;//修改zip源码包 public class Zip2String { public static void main(String[] args) throws Exception {
String alipay_url =
"http://dwbillcenter.alipay.com/downloadBillFile.resource?bizType=trade&userId=20889117596609430156&fileType=csv.zip&bizDates=20170628&downloadFileName=20889117596609430156_20170628.csv.zip&fileId=%2Ftrade%2F20889117596609430156%2F20170628.csv.zip×tamp=1499075857&token=fdcd1fa66d4270ff19f727db0db7af70";
String filename=getDownloadFileName(alipay_url); String down_url = "d:\\test\\ceshi123\\"+filename+".zip";
/*
* 通过调用支付宝接口返回的url下载zip文件
*/
boolean down_success = downLoadZip(alipay_url,down_url);
String connetall = ""; //true or false 下载成功,调用解压方法
if(down_success){
File save_down_url = new File(down_url);
/*
* 解压下载的zip文件
*/
// String unzipFilePath = comZipCvsFile(save_down_url); /*
* 读取下载的zip文件,返回一个string字符串
*/
connetall = readZipToString(save_down_url);
}
/* 返回结果
* 1.false,下载失败
* 2.空字符串||"false"。解压或者读取转string失败
*/
//return connetall;
} /**
* 通过支付宝查询对账单接口返回的url,下载zip文件
* @param alipay_url
* @param down_url
* @return
*/
public static boolean downLoadZip(String alipay_url,String down_url) {
boolean down_success = false;
int bytesum = 0;
int byteread = 0;
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy/MM/dd");
String dateFloder = sf.format(date); InputStream inStream = null;
FileOutputStream fs = null; try { URL url = new URL(alipay_url);
URLConnection conn = url.openConnection();
inStream = conn.getInputStream(); //自定义文件保存地址
String unzipFilePath = down_url.substring(0, down_url.lastIndexOf("\\"));//判断下载保存路径文件夹 File unzipFileDir = new File(unzipFilePath);//下载文件存放地址
if (!unzipFileDir.exists() || !unzipFileDir.isDirectory()) {
unzipFileDir.mkdirs();
}
//解压文件是否已存在
File entryFile = new File(down_url);
if (entryFile.exists()) {
//删除已存在的目标文件
entryFile.delete();
} fs = new FileOutputStream(down_url); byte[] buffer = new byte[4028]; while ((byteread = inStream.read(buffer)) != -1) {
bytesum += byteread;
fs.write(buffer, 0, byteread);
}
down_success = true;
System.out.println(dateFloder+"文件下载成功.....");
} catch (Exception e) {
System.out.println(dateFloder+"文件下载失敗" + e); return false;
} finally {
try {
if (inStream != null) {
inStream.close();
}
} catch (IOException e) {
inStream = null;
} try {
if (fs != null) {
fs.close();
}
} catch (IOException e) {
fs = null;
}
}
return down_success;
} /**
* 读取zip文件,不解压缩直接解析,支持文件名中文,解决内容乱码
* @param file
* @return 读取zip文件,返回字符串
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static String readZipToString(File file) throws Exception {
String connet = "";
try { //获得输入流,文件为zip格式,
//支付宝提供
//20886126836996110156_20160906.csv.zip内包含
//20886126836996110156_20160906_业务明细.csv
//20886126836996110156_20160906_业务明细(汇总).csv
ZipInputStream in = new ZipInputStream(new FileInputStream(file));
//不解压直接读取,加上gbk解决乱码问题
BufferedReader br = new BufferedReader(new InputStreamReader(in,"gbk"));
ZipEntry zipFile;
//返回的字符串---每个文件内容相加
BufferedWriter bw = null;
//循环读取zip中的cvs文件,无法使用jdk自带,因为文件名中有中文
while ((zipFile=in.getNextEntry())!=null) {
if (zipFile.isDirectory()){
//如果是目录,不处理
}
String file_connet = "";
//获得cvs名字
String fileName = zipFile.getName();
System.out.println("-----"+fileName);
//检测文件是否存在
if (fileName != null && fileName.indexOf(".") != -1) {
String line;
/*
* 1.每一行用 | 隔开
* 2.每一个文件用 ; 隔开
*/
// bw = new BufferedWriter(new FileWriter("d:\\test\\test.txt")); //测试读取内容
while ((line = br.readLine()) != null) { file_connet = file_connet + "|" + line;
// System.out.println(line); }
} connet = connet + file_connet + ";";
}
// bw.write(connet);
//关闭流
// bw.close();
br.close();
in.close(); } catch (Exception e) {
System.out.println("zip文件读取失敗" + e); return "false";
} return connet;
} /**解压缩
* 解压通过url获得对账单数据流(.zip)
* @param file //zip文件存放地址
* @return
*/
@SuppressWarnings("unchecked")
public static String comZipCvsFile(File file) throws Exception {
//自定义文件保存地址
String unzipFilePath = file.getCanonicalPath();
unzipFilePath = unzipFilePath.substring(0, unzipFilePath.lastIndexOf("."));
System.out.println("解压后文件保存路径:"+unzipFilePath); //获得输入流,文件为zip格式,
//支付宝提供
//20886126836996110156_20160906.csv.zip内包含
//20886126836996110156_20160906_业务明细.csv
//20886126836996110156_20160906_业务明细(汇总).csv
ZipInputStream in = new ZipInputStream(new FileInputStream(file)); ZipInputStream zin = new ZipInputStream(in);
ZipEntry zipFile;
BufferedOutputStream bos = null;
try { zin = new ZipInputStream(new FileInputStream(file)); while ((zipFile = zin.getNextEntry()) != null) {
System.out.println(zipFile.getName()); File target = new File(file.getParent(), zipFile.getName()); if (!target.getParentFile().exists()) {
// 创建文件父目录
target.getParentFile().mkdirs();
} //创建解压缩文件保存的路径 文件夹
File unzipFileDir = new File(unzipFilePath);//解压文件存放地址---unzipFilePath(解压文件去吃.zip)
if (!unzipFileDir.exists() || !unzipFileDir.isDirectory()) {
unzipFileDir.mkdirs();
} String file_Name_csv = target.getName();
String entryFilePath = unzipFilePath + File.separator + file_Name_csv;//decom_Path(存放地址)+文件名 //解压文件是否已存在
File entryFile = new File(entryFilePath);
if (entryFile.exists()) {
//删除已存在的目标文件
entryFile.delete();
} /*
* 写入文件
*/
// bos = new BufferedOutputStream(new FileOutputStream(target));//解压到和zip在同一个文件夹
bos = new BufferedOutputStream(new FileOutputStream(entryFile));//自定义文件夹 int read = 0;
byte[] buffer = new byte[1024 * 10]; while ((read = zin.read(buffer, 0, buffer.length)) != -1) {
bos.write(buffer, 0, read);
} bos.flush();
}
//关闭流
zin.close();
bos.close(); } catch (Exception e) {
// TODO: handle exception
System.out.println("zip文件解压失敗" + e); return "false";
}
return unzipFilePath;//返回解压文件保存路径 } /**
* 通过alipay_url获取下载的文件名称
* @param alipay_url
* @return
*/
private static String getDownloadFileName(String alipay_url){
String tempStr = alipay_url.substring(alipay_url.indexOf("downloadFileName")+17, alipay_url.length());
tempStr = tempStr.substring(0,tempStr.indexOf(".zip"));
return tempStr;
} }