java之压缩流(ZipOutputStream)

简介:   一、文件压缩,是很有必要的,我们在进行文件,传输过程中,很多时候都是,都是单个文件单个文件发送接收,但是当数据量特别大,或者文件数量比较多的时候,这个时候就可以考虑文件压缩。  二、优势:文件压缩过后,只需要进行一次文件的传输就可以了。

一、文件压缩,是很有必要的,我们在进行文件,传输过程中,很多时候都是,都是单个文件单个文件发送接收,但是当数据量特别大,或者文件数量比较多的时候,这个时候就可以考虑文件压缩。

  二、优势:文件压缩过后,只需要进行一次文件的传输就可以了。减少频繁发送的问题。缺点:文件大小会变大,如果传输过程中断了,风险较大。

package com.global.boss.utils.io;

import org.apache.commons.io.IOUtils;
import org.springblade.core.tool.utils.StringUtil;
import org.springframework.http.MediaType;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Iterator;
import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * 文件工具类
 *
 * @author star
 */
public class FileUtil {

	private final static String WINDOWS_TEMP_DIR = "C:/temp";

	private final static String LINUX_TEMP_DIR = "/var/tmp";

	/**
	 * 创建随机文件夹
	 *
	 * @return 返回文件夹信息
	 */
	public static String createDir(String filePath) {
		long currentTimeMillis = System.currentTimeMillis();
		filePath = filePath + "/" + currentTimeMillis + "-" + UUID.randomUUID() + "-temp";
		File file = new File(filePath);
		if (!file.exists()) {
			file.mkdirs();
		}
		return filePath;
	}

	/**
	 * 删除文件夹
	 * @param dirPath 文件夹路径
	 */

	public static void deleteDir(String dirPath) {
		File file = new File(dirPath);
		if (file.exists()) {
			if (file.isDirectory()) {
				String[] files = file.list();
				for (String path : files) {
					String currPath = dirPath + "\" + path;
					File deleteFile = new File(currPath);
					if (deleteFile.isDirectory()) {
						deleteDir(currPath);
					}
					deleteFile.delete();
				}
				file.delete();
			} else {
				file.delete();
			}
		}
	}


	public static byte[] file2byte(File tradeFile) {
		byte[] buffer = null;
		try {
			FileInputStream fis = new FileInputStream(tradeFile);
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			byte[] b = new byte[1024];
			int n;
			while ((n = fis.read(b)) != -1) {
				bos.write(b, 0, n);
			}
			fis.close();
			bos.close();
			buffer = bos.toByteArray();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return buffer;
	}

	/**
	 * 获取临时目录文件夹
	 *
	 * @return
	 */
	public static String getTempDir() {
		if (isWindows()) {
			return getWindowsOsTempDir();
		} else {
			return getLinuxOsTempDir();
		}
	}

	private static String getWindowsOsTempDir() {
		return WINDOWS_TEMP_DIR;
	}

	private static String getLinuxOsTempDir() {
		return LINUX_TEMP_DIR;
	}

	public static boolean isWindows() {
		String osName = System.getProperty("os.name");
		return StringUtil.hasText(osName) && !"LINUX".equalsIgnoreCase(osName);
	}


	/**
	 * 提供给用户使用的基本压缩类
	 *
	 * @param srcPath 被压缩文件夹路径
	 * @param outPath 输出路径
	 * @throws IOException
	 */
	public static void compressFile(String srcPath, String outPath) throws IOException {
		//读取源文件
		File srcFile = new File(srcPath);
		//判断输出路径是否正确
		File outFile = new File(outPath);
		//如果只是路劲加入对应的压缩名称
		if (outFile.isDirectory()) {
			//用"/"作文判断标准
			if (outPath.endsWith(File.separator)) {
				outPath += srcFile.getName().split("\.")[0] + ".zip";
			} else {
				outPath += File.separator + srcFile.getName().split("\.")[0] + ".zip";
			}
		}
		//读取文件流
		FileOutputStream fileOutputStream = new FileOutputStream(outPath);
		ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);
		//压缩文件
		compressFile(srcFile, srcFile.getName(), zipOutputStream);
		//关闭流
		zipOutputStream.close();
		fileOutputStream.close();
	}

	/**
	 * 迭代方式进行文件压缩
	 *
	 * @param file
	 * @param fileName
	 * @param outputStream
	 * @throws IOException
	 */
	private static void compressFile(File file, String fileName, final ZipOutputStream outputStream) throws IOException {
		//如果是目录
		if (file.isDirectory()) {
			//创建文件夹
			outputStream.putNextEntry(new ZipEntry(fileName + "/"));
			//迭代判断,并且加入对应文件路径
			File[] files = file.listFiles();
			Iterator<File> iterator = Arrays.asList(files).iterator();
			while (iterator.hasNext()) {
				File f = iterator.next();
				compressFile(f, fileName + "/" + f.getName(), outputStream);
			}
		} else {
			//创建文件
			outputStream.putNextEntry(new ZipEntry(fileName));
			//读取文件并写出
			FileInputStream fileInputStream = new FileInputStream(file);
			BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
			byte[] bytes = new byte[1024];
			int n;
			while ((n = bufferedInputStream.read(bytes)) != -1) {
				outputStream.write(bytes, 0, n);
			}
			//关闭流
			fileInputStream.close();
			bufferedInputStream.close();
		}
	}

}