jdk提供的zip只能按UTF-8格式处理,如果解压一个包含中文文件名的zip包时,如果使用jdk自带的zip包,解压时如果文件名有中文,会抱非法参数异常,主意编码格式。
生成csv文件代码如下:
package com.util; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.List; public class ExportUtil { /** * 导出 * @param file csv文件(路径+文件名),csv文件不存在会自动创建 * @param dataList 数据 * @return */ public static boolean exportCsv(File file, List<String> dataList){ boolean isSucess=false; FileOutputStream out=null; OutputStreamWriter osw=null; BufferedWriter bw=null; try { out = new FileOutputStream(file); osw = new OutputStreamWriter(out, "GBK"); bw =new BufferedWriter(osw); if(dataList!=null && !dataList.isEmpty()){ for(String data : dataList){ bw.append(data).append("\r"); } } isSucess=true; } catch (Exception e) { isSucess=false; }finally{ if(bw!=null){ try { bw.close(); bw=null; } catch (IOException e) { e.printStackTrace(); } } if(osw!=null){ try { osw.close(); osw=null; } catch (IOException e) { e.printStackTrace(); } } if(out!=null){ try { out.close(); out=null; } catch (IOException e) { e.printStackTrace(); } } } return isSucess; } }
压缩单一文件或者多个文件工具类代码如下:
package com.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipFileUtil { public static boolean zipSingleFile(String file, String zipFile) throws IOException { boolean bf = true; File f = new File(file); if (!f.exists()) { System.out.println("文件不存在"); bf = false; } else { File ff = new File(zipFile); if (!f.exists()) { ff.createNewFile(); } // 创建文件输入流对象 FileInputStream in = new FileInputStream(file); // 创建文件输出流对象 FileOutputStream out = new FileOutputStream(zipFile); // 创建ZIP数据输出流对象 ZipOutputStream zipOut = new ZipOutputStream(out); // 得到文件名称 String fileName = file.substring(file.lastIndexOf('/') + 1,file.length()); // 创建指向压缩原始文件的入口 ZipEntry entry = new ZipEntry(fileName); zipOut.putNextEntry(entry); // 向压缩文件中输出数据 int number = 0; byte[] buffer = new byte[512]; while ((number = in.read(buffer)) != -1) { zipOut.write(buffer, 0, number); } zipOut.close(); out.close(); in.close(); } return bf; } /** * @param files 待压缩的文件列表 * @param zipfile 压缩后的文件名称 * @return boolean * @throws :Exception * @Function: zipFiles * @Description:多个文件的ZIP压缩 */ public static boolean zipFiles(String[] files, String zipfile)throws Exception { boolean bf = true; // 根据文件路径构造一个文件实例 File ff = new File(zipfile); // 判断目前文件是否存在,如果不存在,则新建一个 if (!ff.exists()) { ff.createNewFile(); } // 根据文件路径构造一个文件输出流 FileOutputStream out = new FileOutputStream(zipfile); // 传入文件输出流对象,创建ZIP数据输出流对象 ZipOutputStream zipOut = new ZipOutputStream(out); // 循环待压缩的文件列表 for (int i = 0; i < files.length; i++) { File f = new File(files[i]); if (!f.exists()) { bf = false; } try { // 创建文件输入流对象 FileInputStream in = new FileInputStream(files[i]); // 得到当前文件的文件名称 String fileName = files[i].substring(files[i].lastIndexOf('/') + 1, files[i].length()); // 创建指向压缩原始文件的入口 ZipEntry entry = new ZipEntry(fileName); zipOut.putNextEntry(entry); // 向压缩文件中输出数据 int nNumber = 0; byte[] buffer = new byte[512]; while ((nNumber = in.read(buffer)) != -1) { zipOut.write(buffer, 0, nNumber); } // 关闭创建的流对象 in.close(); } catch (IOException e) { e.printStackTrace(); bf = false; } } zipOut.close(); out.close(); return bf; } }
测试类代码如下(个人测试中文不会乱码)
package com.test; import java.io.File; import java.util.ArrayList; import java.util.List; import com.hxxr.app.exportcsv.util.ExportUtil; import com.hxxr.app.exportcsv.util.ZipFileUtil; public class Test { private static String path1 = "d:/test/datas1.csv"; private static String path2 = "d:/test/datas2.csv"; private static String zpath = "d:/datas.zip"; private static String zpaths = "d:/datas.zip"; public static void main(String[] args) throws Exception{ List<String> dataList = new ArrayList<>(); dataList.add("一,二,三,四,五,六"); for (int i = 0; i < 1000; i++) { dataList.add(Math.random()*100 +","+Math.random()*100 +","+Math.random()*100 + ","+Math.random()*100 +","+Math.random()*100 +","+Math.random()*100); } /** * 导出csv文件 */ ExportUtil.exportCsv(new File(path1), dataList); ExportUtil.exportCsv(new File(path2), dataList); /** * 将生成的单一文件压缩 */ boolean bo = ZipFileUtil.zipSingleFile(path1, zpath); if(bo){ System.out.println("单一压缩文件成功!"); }else{ System.out.println("单一压缩文件失败!"); } /** * 将生成的多个文件压缩 */ String [] files = {"d:/test/datas1.csv","d:/test/datas2.csv"}; boolean boo = ZipFileUtil.zipFiles(files, zpaths); if(boo){ System.out.println("多文件压缩文件成功!"); }else{ System.out.println("多文件压缩文件失败!"); } } }