java原生文件打包

一、背景

前端时间,自己做的项目需要打包功能,不想再引外部的jar包

便用java.util.zip做了下该功能

二、适用场景

生成多个word、excel、xml等文件,并要求打包下载的情形

例:项目信息的多选导出word

三、实现

实现分为三个部分,分别是

1、将字符串保存为文件,都是最基本的IO操作

    /**
     * @Description 将字符串保存为文件
     * @author liuy-8
     * @date 2015年5月20日 下午1:48:18
     * @param filePath
     * @param content
     */
    public static void saveFile(String filePath, String content){
        File file = new File(filePath);
        FileWriter fw = null;
        //这里没有使用BufferWrite,是因为数据是一次性写入
        //BufferWrite的优势在于调用write方法时,使用缓冲区
        //而FileWriter每次调用write方法,都调用StreamEncoder的write方法
        try {
            fw = new FileWriter(file);//缓冲区1024字符
            fw.write(content);
            fw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            //关闭FileWriter
            try {
                if(null != fw)
                    fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

2、扫描指定文件夹下所有的文件,准备压缩包的写入工作

这一部分依然是基本的IO操作,要注意安全关闭输入输出流,打开与关闭的顺序

    /**
     * @Description 获取文件夹中所有文件路径
     * @author liuy-8
     * @date 2015年5月27日 下午5:25:24
     * @param folderPath 文件夹路径
     * @return 文件夹中所有文件路径
     */
    public static List<String> getFilesPath(String folderPath){
        List<String> filesPath = new ArrayList<String>();
        File folder = new File(folderPath);
        File[] fileList = folder.listFiles();
        for(File file : fileList){
            if(file.isDirectory()){
                //是文件夹,递归遍历
                filesPath.addAll(getFilesPath(file.getPath()));
            }else{
                //是文件,加入文件列表
                filesPath.add(file.getPath());
            }
        }
        return filesPath;
    }

    /**
     * @Description 压缩文件夹
     * @author liuy-8
     * @date 2015年5月26日 下午1:42:00
     * @param folderPath    文件夹路径
     * @param zipFilePath    压缩文件路径
     */
    public static void folder2Zip(String folderPath, String zipFilePath){
        //获取当前系统文件分隔符
        String fileSeparator = System.getProperty("file.separator");
        //若传入路径最后没有文件分隔符,加上
        if(folderPath.lastIndexOf(fileSeparator) != (folderPath.length() - 1)){
            folderPath = folderPath + fileSeparator;
        }
        //获取文件夹下所有文件路径
        List<String> filesPath = getFilesPath(folderPath);
        //文件输出流
        FileOutputStream fos = null;
        //缓冲输出流
        BufferedOutputStream bos = null;
        //zip输出流
        ZipOutputStream zos = null;
        try {
            fos = new FileOutputStream(zipFilePath);
            bos = new BufferedOutputStream(fos);
            zos = new ZipOutputStream(bos);
            for(String filePath : filesPath){
                //将文件写入zip输出流
                writeFile2Zip(folderPath, filePath, zos);
            }
            zos.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            //关闭zip输出流
            try {
                if(null != zos){
                    zos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            //关闭缓冲输出流
            try {
                if(null != bos){
                    bos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            //关闭文件输出流
            try {
                if(null != fos){
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

3、将文件依次写入zip输出流

在第二步已经用ZipOutputStream创建了压缩文件的输出流,这一步里,每个文件都要对应一个ZipEntry对象

要将这个对象加入到压缩文件的输出流中后再写入数据,并且写完数据必须在输出流中关闭该ZipEntry对象

这里有2个容易出错的地方:

一是ZipEntry对象需要一个路径,这个路径是相对于压缩文件夹的相对路径,用来保证子文件夹文件的顺利压入

二是往zip输出流中写入的字节的时候,要判断循环读取字节时文件输入流中读取了多少字节长度,读多少写多少,不然在文件尾部会出现错误数据

    /**
     * @Description 将文件写入zip输出流
     * @author liuy-8
     * @date 2015年5月27日 下午5:23:42
     * @param folderPath    待压缩文件夹路径
     * @param filePath        待写入文件
     * @param zos            zip输出流
     */
    private static void writeFile2Zip(String folderPath, String filePath, ZipOutputStream zos){
        //缓冲区
        byte[] bs = new byte[1024];
        //获取文件的相对路径
        String entryName = filePath.substring(filePath.indexOf(folderPath) + folderPath.length());
        //创建zip实体
        ZipEntry entry = new ZipEntry(entryName);
        //输入流
        FileInputStream fis = null;
        //缓冲输入流
        BufferedInputStream bis = null;
        try {
            //将zip实体加入zip输出流
            zos.putNextEntry(entry);
            fis = new FileInputStream(filePath);
            bis = new BufferedInputStream(fis);
            //写入zip输出流
            int len = 0;
            while((len = bis.read(bs, 0, 1024)) > 0){
                zos.write(bs, 0, len);
            }
            zos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            //关闭entity
            try {
                zos.closeEntry();
            } catch (IOException e) {
                e.printStackTrace();
            }
            //关闭BufferedInputStream
            try {
                if(null != bis){
                    bis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            //关闭FileInputStream
            try {
                if(null != fis){
                    bis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

此类已封装为GlodonFileUtil,有需要找我要即可

时间: 2024-07-31 05:50:53

java原生文件打包的相关文章

Java批量文件打包下载

经常遇到选择多个文件进行批量下载的情况,可以先将选择的所有的文件生成一个zip文件,然后再下载,该zip文件,即可实现批量下载,但是在打包过程中,常常也会出现下载过来的zip文件中里面有乱码的文件名,通过使用ant.jar中的org.apache.tools.zip里的ZipOutPutStream为实现编码的设置. 代码如下: ant包引用 [html] view plain copy print? <span style="font-size:14px">Xml代码 &

Java—将文件打包为zip压缩文件

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipE

java jar文件打包成exe(Launch4j使用说明)

在日常的项目中需要把jar打包成exe.怎样快速的实现此功能.下面通过Launch4j的使用方法来介绍整个打包过程. 第一步:生成jar文件 第二部:使用Launch4j 图来描述过,简单明了.一切尽在不言中.

java 多文件打包压缩

public static void main(String[] args) { File[] srcFiles = { new File("E:\\testZip\\testZip.zip"), new File("E:\\testZip\\test2.json"), new File("E:\\testZip\\test3.txt") }; File zipFile = new File("E:\\ZipFile.zip"

JAVA学习笔记 -- 把资源文件打包到jar包

初学GUI,用Eclipse导出jar包,设定的最小化图标不能显示(hello.png文件放在项目的根目录下).代码如下: import javax.swing.JFrame; import java.awt.Toolkit; import java.awt.Image; import java.net.URL; public class GUITest { public static void main(String[] args) { JFrame frame = new JFrame();

Java实现文件自动打包成zip并下载的代码

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipOutputStreamDemo { public static void main(String[] args) throws Exception { by

java下载文件可打包

//定义下载保存的文件名称 StringBuffer zipName = new StringBuffer(11111.zip); //从前台接到一个图片id的数组 String[] images=request.getParameterValues(imgId); System.out.println("imgId============"+imgId); DisplayManager dm=new DisplayManager(); ZipOutputStream zos=null

手把手教你如何把java代码,打包成jar文件以及转换为exe可执行文件

1.背景: 学习java时,教材中关于如题问题,只有一小节说明,而且要自己写麻烦的配置文件,最终结果却只能转换为jar文件.实在是心有不爽.此篇博客教你如何方便快捷地把java代码,打包成jar文件以及转换为exe可执行文件 2.前言: 我们都知道Java可以将二进制程序打包成可执行jar文件,双击这个jar和双击exe效果是一样一样的,但感觉还是不同.其实将java程序打包成exe也需要这个可执行jar文件. 3.准备: eclipse或Myeclipse以及exe4j(网上有软件和帐号下载)

java文件打包成exe可执行文件

java文件打包成exe文件,分为两步,首先用eclipse将java文件打包成jar文件,然后用exe4j将jar文件打包成可执行exe文件 一:用eclipse将java文件打包成jar文件 如果java文件未引用外部包,可以将其打包成Jar File,如果其引用了外部包文件,最好将其打包成Runnable Jar File,这样可以将外部包文件一并打包进去,虽然包有点大,但是省去了在其它电脑上不能运行的麻烦.(我自己是打包成了Runnable Jar File,操作非常简单,这里不再叙述此