Java 解压压缩文件,springMVC 接收压缩文件

2023-11-03

解压 zip,rar 类型的压缩文件

1、首先需要 jar 包


ant-1.6.5.jar :解压zip格式的压缩文件

junrar-0.7.jar :解压rar 格式

如果是 maven  :

<dependency>
            <groupId>ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.6.5</version>
        </dependency>
        <dependency>
            <groupId>com.github.junrar</groupId>
            <artifactId>junrar</artifactId>
            <version>0.7</version>
        </dependency>

加入 springMVC的jar包

2、工具类,

2.1、

网上好多,这里是有2个解压zip 的(一个有编码设置,一个没有编码设置)

2个 解压rar的,(一个有编码设置,一个没有编码设置)

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.Enumeration;
import java.util.zip.ZipOutputStream;

import javax.servlet.http.HttpServletRequest;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;

import com.github.junrar.Archive;
import com.github.junrar.rarfile.FileHeader;

public class CompressFileUtils {
	
	public static void unZipFiles(HttpServletRequest request, String zipPath,
			String descDir) throws IOException {
		unZipFiles(request, new File(zipPath), descDir);
	}

	/**
	 * 解压文件到指定目录
	 * 
	 */
	@SuppressWarnings("rawtypes")
	public static void unZipFiles(HttpServletRequest request, File zipFile,
			String descDir) throws IOException {
		request.setCharacterEncoding("utf-8");
		File pathFile = new File(descDir);
		if (!pathFile.exists()) {
			pathFile.mkdirs();
		}
		ZipFile zip = new ZipFile(zipFile);
		for (Enumeration entries = zip.getEntries(); entries.hasMoreElements();) {
			ZipEntry entry = (ZipEntry) entries.nextElement();
			entry.setUnixMode(644); // 解决linux乱码
			String zipEntryName = entry.getName();
			InputStream in = zip.getInputStream(entry);

			BufferedInputStream bis = new BufferedInputStream(in);

			String outPath = (descDir + zipEntryName).replaceAll("\\*", "/");
			;
			// 判断路径是否存在,不存在则创建文件路径
			File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
			if (!file.exists()) {
				file.mkdirs();
			}
			// 判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
			if (new File(outPath).isDirectory()) {
				continue;
			}
			// 输出文件路径信息
			System.out.println(outPath);

			OutputStream out = new FileOutputStream(outPath);
			Writer out1 = new OutputStreamWriter(out, "UTF-8");
			byte[] buf1 = new byte[1024];
			int len;
			while ((len = in.read(buf1)) > 0) {
				out.write(buf1, 0, len);
			}
			in.close();
			out.close();
		}
		System.out.println("******************解压完毕********************");
	}

	/**
	 * 根据原始rar路径,解压到指定文件夹下.
	 * 
	 * @param srcRarPath
	 *            原始rar路径
	 * @param dstDirectoryPath
	 *            解压到的文件夹
	 * @throws UnsupportedEncodingException
	 */
	public static void unRarFile(HttpServletRequest request, String srcRarPath,
			String dstDirectoryPath) throws UnsupportedEncodingException {
		request.setCharacterEncoding("utf-8");
		if (!srcRarPath.toLowerCase().endsWith(".rar")) {
			System.out.println("非rar文件!");
			return;
		}
		File dstDiretory = new File(dstDirectoryPath);
		if (!dstDiretory.exists()) {// 目标目录不存在时,创建该文件夹
			dstDiretory.mkdirs();
		}
		Archive a = null;
		try {
			a = new Archive(new File(srcRarPath));
			if (a != null) {
				a.getMainHeader().print(); // 打印文件信息.
				FileHeader fh = a.nextFileHeader();
				while (fh != null) {
					String fileName = fh.getFileNameW().isEmpty()?fh.getFileNameString():fh.getFileNameW();
					System.out.println("fileName"+fileName);
					if (fh.isDirectory()) { // 文件夹
						File fol = new File(dstDirectoryPath + File.separator
								+ fileName);
						fol.mkdirs();
					} else { // 文件
						File out = new File(dstDirectoryPath + File.separator
								+ fh.getFileNameString().trim());
						// System.out.println(out.getAbsolutePath());
						try {// 之所以这么写try,是因为万一这里面有了异常,不影响继续解压.
							
							if (!out.exists()) {
								if (!out.getParentFile().exists()) {// 相对路径可能多级,可能需要创建父目录.
									out.getParentFile().mkdirs();
								}
								out.createNewFile();
							}
							FileOutputStream os = new FileOutputStream(out);
							a.extractFile(fh, os);
							os.close();
						} catch (Exception ex) {
							ex.printStackTrace();
						}
					}
					fh = a.nextFileHeader();
				}
				a.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 解压zip文件
	 * 
	 * @param sourceFile
	 *            ,待解压的zip文件; toFolder,解压后的存放路径
	 * @throws Exception
	 **/

	public static void zipToFile(String sourceFile, String toFolder)
			throws Exception {
		String toDisk = toFolder;// 接收解压后的存放路径
		ZipFile zfile = new ZipFile(sourceFile, "GBK");// 连接待解压文件
		Enumeration zList = zfile.getEntries();// 得到zip包里的所有元素
		ZipEntry ze = null;
		byte[] buf = new byte[1024];
		while (zList.hasMoreElements()) {
			ze = (ZipEntry) zList.nextElement();
			if (ze.isDirectory()) {
//				log.info("打开zip文件里的文件夹:" + ze.getName() + "skipped...");
				continue;
			}
			OutputStream outputStream = null;
			InputStream inputStream = null;
			try {
				// 以ZipEntry为参数得到一个InputStream,并写到OutputStream中
				outputStream = new BufferedOutputStream(new FileOutputStream(
						getRealFileName(toDisk, ze.getName())));
				inputStream = new BufferedInputStream(zfile.getInputStream(ze));
				int readLen = 0;
				while ((readLen = inputStream.read(buf, 0, 1024)) != -1) {
					outputStream.write(buf, 0, readLen);
				}
				inputStream.close();
				outputStream.close();
			} catch (Exception e) {
//				log.info("解压失败:" + e.toString());
				throw new IOException("解压失败:" + e.toString());
			} finally {
				if (inputStream != null) {
					try {
						inputStream.close();
					} catch (IOException ex) {

					}
				}
				if (outputStream != null) {
					try {
						outputStream.close();
					} catch (IOException ex) {
						ex.printStackTrace();
					}
				}
				inputStream = null;
				outputStream = null;
			}

		}
		zfile.close();
	}

	/**
	 * 
	 * 给定根目录,返回一个相对路径所对应的实际文件名.
	 * 
	 * @param zippath
	 *            指定根目录
	 * 
	 * @param absFileName
	 *            相对路径名,来自于ZipEntry中的name
	 * 
	 * @return java.io.File 实际的文件
	 */

	private static File getRealFileName(String zippath, String absFileName) {
//		log.info("文件名:" + absFileName);
		String[] dirs = absFileName.split("/", absFileName.length());
		File ret = new File(zippath);// 创建文件对象
		if (dirs.length > 1) {
			for (int i = 0; i < dirs.length - 1; i++) {
				ret = new File(ret, dirs[i]);
			}
		}
		if (!ret.exists()) {// 检测文件是否存在
			ret.mkdirs();// 创建此抽象路径名指定的目录
		}
		ret = new File(ret, dirs[dirs.length - 1]);// 根据 ret 抽象路径名和 child
													// 路径名字符串创建一个新 File 实例
		return ret;
	}
	
	 /** 
     * 根据原始rar路径,解压到指定文件夹下.      
     * @param srcRarPath 原始rar路径 
     * @param dstDirectoryPath 解压到的文件夹      
     */
     public static void unRarFile2(String srcRarPath, String dstDirectoryPath) {
         if (!srcRarPath.toLowerCase().endsWith(".rar")) {
             System.out.println("非rar文件!");
             return;
         }
         System.out.println("dstDirectoryPath"+dstDirectoryPath);
         File dstDiretory = new File(dstDirectoryPath);
         if (!dstDiretory.exists()) {// 目标目录不存在时,创建该文件夹
             dstDiretory.mkdirs();
         }
         Archive a = null;
         try {
             a = new Archive(new File(srcRarPath));
             if (a != null) {
                 //a.getMainHeader().print(); // 打印文件信息.
                 FileHeader fh = a.nextFileHeader();
                 while (fh != null) {
                          //防止文件名中文乱码问题的处理
                
String fileName = fh.getFileNameW().isEmpty()?fh.getFileNameString():fh.getFileNameW();
                     if (fh.isDirectory()) { // 文件夹 
                    File fol = new File(dstDirectoryPath + File.separator + fileName);
                       //  fol.mkdirs();
                     } else { // 文件
                    File out = new File(dstDirectoryPath + File.separator + fileName.trim());
                         try { 
                             if (!out.exists()) {
                                 if (!out.getParentFile().exists()) {// 相对路径可能多级,可能需要创建父目录. 
                                     out.getParentFile().mkdirs();
                                 }
                                 out.createNewFile();
                             }
                             FileOutputStream os = new FileOutputStream(out);
                             a.extractFile(fh, os);
                             os.close();
                         } catch (Exception ex) {
                             ex.printStackTrace();
                         }
                     }
                     fh = a.nextFileHeader();
                 }
                 a.close();
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
}

2.2、

package com.yogapay.boss.utils;

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.io.InputStream;
import java.io.OutputStream;
import java.util.HashSet;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.disk.DiskFileItem;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;


public class UploadUtil {

	
	public static File[] resolveCompressUploadFile(HttpServletRequest request,
			MultipartFile file, String path) throws Exception {

		request.setCharacterEncoding("utf-8");
		/* 截取后缀名 */
		if (file.isEmpty()) {
			throw new Exception("文件不能为空");
		}
//		String fileName = file.getOriginalFilename();
		System.out.println("sssss"+file.getOriginalFilename());
		String fileName = new String(file.getOriginalFilename());
		System.out.println("fileName"+fileName);
		int pos = fileName.lastIndexOf(".");
		String extName = fileName.substring(pos + 1).toLowerCase();
		// 判断上传文件必须是zip或者是rar否则不允许上传
		if (!extName.equals("zip") && !extName.equals("rar")) {
			throw new Exception("上传文件格式错误,请重新上传");
		}
		// 时间加后缀名保存
		String saveName = "aaas" + "." + extName;
		// 根据服务器的文件保存地址和原文件名创建目录文件全路径
		File pushFile = new File(path + "/" + saveName);
		File descFile = new File(path);
		if (!descFile.exists()) {
			descFile.mkdirs();
		}
		// 解压目的文件
		String descDir = path + "/";
		System.out.println("desc:" + descDir);
		file.transferTo(pushFile);

		// 开始解压zip
		if (extName.equals("zip")) {
			CompressFileUtils.zipToFile(path + "/" + saveName, descDir);
		}else if (extName.equals("rar")) {
			// 开始解压rar
			CompressFileUtils.unRarFile2(pushFile.getAbsolutePath(), descDir);
		}   else {
			throw new Exception("文件格式不正确不能解压");
		}
		// 删除 解压完的压缩文件
		doDeleteEmptyDir(path + "/" + saveName);
		return returnFiles(descDir+"");
	}
	//返回 File[]
	public static File[] returnFiles(String strPath) {
		File dir = new File(strPath);
		File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组
		if (files != null) {
			for (int i = 0; i < files.length; i++) {
				String fileName = files[i].getName();
				File f = new File(strPath + File.separator + fileName);
				System.out.println("文件名称:"+fileName);
				if (f.isDirectory()) {// 如果f是目录
					File[] newfiles = f.listFiles();
					return newfiles;
				}

			}
		}
		return files;
	}

	//删除指定文件
	private static void doDeleteEmptyDir(String dir) {
		boolean success = (new File(dir)).delete();
		if (success) {
			System.out.println("Successfully deleted empty directory: " + dir);
		} else {
			System.out.println("Failed to delete empty directory: " + dir);
		}
	}

	// 删除目录下的所有
	public static boolean deleteDir(File dir) {
        if (dir.isDirectory()) {
            String[] children = dir.list();
            //递归删除目录中的子目录下
            for (int i=0; i<children.length; i++) {
                boolean success = deleteDir(new File(dir, children[i]));
                if (!success) {
                    return false;
                }
            }
        }
        // 目录此时为空,可以删除
        return dir.delete();
    }
	
	
	//保存file
	public static void saveFile(File file,String path,String name) throws IOException{
		FileInputStream fis = null;
		FileOutputStream fos = null;
		
		try {
			fis = new FileInputStream(file);
			fos = new FileOutputStream(path + File.separator
					+ name, true);
			int count = fis.available();// 获取这个文件里共有多少个字节
			byte[] b = new byte[count];
			int len = 0;
			while ((len = fis.read(b)) != -1) {
				fos.write(b);
			}
			//System.out.println("复制成功!");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if (fis != null) {
					fis.close();
				}
				if (fos != null) {
					fos.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

3、controller

public String msave(final ModelMap model,	
			@RequestParam("zip") MultipartFile zip,
			HttpServletRequest request) throws SQLException,
			UnsupportedEncodingException {
					String path = request.getSession().getServletContext()
					.getRealPath("images"+File.separator+"jieya");
// 解压,
					File[] Files = UploadUtil.resolveCompressUploadFile(
							request, zip, path);
					if (UploadUtil.inspectFile(Files)) {
						// 保存,这里是将解压的文件保存到123目录下
						for (File file : Files) {
							System.out.println("file" + file.getName());
							if (!saveFile(file, request,
									"123")) {
								throw new Exception();
							}
						}
						System.out.println("删除文件");
						// 删除临时目录
						UploadUtil.deleteDir(new File(path));
					} else {
						System.out.println("文件类型错误");
						throw new Exception();
					}
}

4、jsp

<form action="" method="post" enctype="multipart/form-data">
上传压缩文件:<input id="file_upload" name="zip" type="file" /><input
				type="submit" value="提交" />
</form>



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 解压压缩文件,springMVC 接收压缩文件 的相关文章

  • java.lang.NoClassDefFoundError: javax/ws/rs/core/Configuration

    我正在实现轻松的网络服务 并且正在使用 jboss 4 0 但我遇到以下异常 java lang NoClassDefFoundError javax ws rs core Configuration 我的 web xml 是
  • 将用户库添加到 Ant Builder 类路径

    我在为 Eclipse 项目设置 Ant Builder 时遇到问题 我确实在 Eclipse 中将几个第 3 方库配置为用户库 这些库已添加到我的项目的构建路径中 一切正常 我的问题是 如果我想从 Eclipse 使用 Ant Build
  • 如何使用postman调用REST API进行azure文件存储?

    我想通过postman调用azure的文件存储相关的REST API 以下是我提出请求的方式 我正在请求列出文件存储帐户中的所有共享 如下所述 https learn microsoft com en us rest api storage
  • 如何从 AccountManager.getAccounts() 获取与特定帐户关联的图标

    每个帐户的帐户设置中都会显示一个图标 对于 Google 帐户有一个图标 对于 Facebook 帐户有另一个图标 有没有办法从应用程序的代码中获取该图标 最后我解决了 private Drawable getIconForAccount
  • 将json URL导入到java并使用jackson库解析它

    我正在尝试读取 java 中的 json 链接并解析它 以便我可以将它用于其他事务 但问题是我收到错误 我真的不知道该如何处理它们 这是代码 package weather data import weather data import c
  • 使 TreeMap 比较器容忍 null

    这个定制的 Valuecomarator 按其值对 TreeMap 进行排序 但在搜索 TreeMap 是否具有某个键时 它不能容忍 nullpointException 如何修改比较器来处理零点 import java io IOExce
  • 通过 JDBC 调用 Sybase 存储过程时结果集为空

    我正在调用一个通过 JDBC 返回多个结果集的 Sybase 存储过程 我需要获取一个特定的结果集 其中有一列名为 结果 这是我的代码 CallableStatement cs conn prepareCall sqlCall cs reg
  • Android 背景 + 文本 + 按钮图标

    我想要一个图像设置为文本的背景 并在文本的左侧设置一个图标 在iPhone中非常简单 但不知道如何在Android上做到这一点 调整按钮的大小并保持图标 文本的位置和距离正确 iPhone 安卓我有这个 xml代码是
  • UiBinder 中的 gwt 按钮

    我需要创建一个按钮 所以它是一个带有图像的按钮 gwt with UiBinder 但我不确定如何进行 这是我的ui xml code
  • 指定自定义应用程序上下文

    我们正在将一些数据服务从使用 jersey spring 的 Jersey 1 x 迁移到使用 jersey spring3 的 Jersey 2 x 我们有一些继承自 JerseyTest 的测试类 其中一些类使用 web xml 文件中
  • 为什么我无法解开根节点并反序列化对象数组?

    为什么我无法通过展开根节点来反序列化对象数组 import java io IOException import java util Arrays import java util List import org codehaus jack
  • 如何更改tomcat jmx密码的文件权限

    我正在尝试保护 Windows 平台上托管的本地 tomcat 实例上的 JMX 访问 我已经创建了访问权限和密码文件 并使用以下 VM 参数插入这些文件 Dcom sun management jmxremote password fil
  • Hibernate3:自引用对象

    需要一些帮助来了解如何执行此操作 我将在文件系统上运行递归 查找 并且希望将信息保留在单个数据库表中 具有自引用的层次结构 这是我想要填充的数据库表结构 目录对象表 id int NOT NULL name varchar 255 NOT
  • 根据结果​​重试方法(而不是异常)

    我有一个具有以下签名的方法 public Optional
  • 将 Class 对象转换为字节

    如果我有一个Class http java sun com j2se 1 5 0 docs api java lang Class html在运行时实例 我可以获得它的 byte 表示形式吗 我感兴趣的字节将在类文件格式 http java
  • 使用 colt java lib 时出现“矩阵太大”异常

    我正在使用 cern colt matrix lib 进行稀疏矩阵计算 但似乎我一直遇到此错误 线程 main 中的异常 java lang IllegalArgumentException 矩阵太大 我认为这是因为构造函数在 nrows
  • Java可以进行进程监控吗?

    是否可以用Java编写一个在托盘中运行的应用程序 并且当启动某个应用程序时 它可以检测到它 我想对某些程序执行此操作 以了解我每周使用它们多长时间 我是 Java 新手 所以我不知道 Java 是否是最适合此操作的语言 或者它是否具有对操作
  • 在 Java Web 应用程序中获取 DataSource 资源

    我的 context xml 文件中有以下资源标记
  • 如果可能,将 jFrame 输出到第二台显示器

    我在 Java 中的 Swing 上有一个 jFrame 我希望它输出到第二个监视器 如果该监视器存在 我尝试过这个 通过this http download oracle com javase 6 docs api java awt Gr
  • 使用反射 API 填充 Proto 中的地图字段

    我正在尝试编写一个模块 该模块将获取 Message Builder 和从字段名称到值的映射 并将用值填充构建器 一切正常 直到我遇到地图字段 使用 Proto3 我收到一条特定消息 我知道我可以执行该消息的字段 builder b put

随机推荐

  • 【深入浅出leveldb】文件类型与文件名

    深入浅出leveldb 文件类型与文件名 leveldb运行一段时间后 系统中会产生一些文件 这些文件有哪些 各个文件又有什么作用 文件名怎么命名的呢 本节来剖析这一块东东 代码在 db filename h db filename cc
  • emWin界面刷新

    1 在对话框回调函数中定时重绘按键 cbDialogHome WM MESSAGE pMsg Switch pMsg gt MsgId Case WM INIT DIALOG WM CreateTimer pMsg gt hWin 0 10
  • python 连接 hive

    我建了一个CentOS的虚拟机 为了验证python连接hive 首先 在服务器端除了安装hive 还需要做以下配置 1 配置当前用户的权限 到hadoop下面的 etc hadoop core site xml 2 配置客户端的权限 增加
  • R语言里面的lag()和diff()函数

    R里面的LAG只适用于时间序列 不适合于dataframe或者向量 因此需要自己写一个小小的函数来实现lag的功能 lagdf lt function x k c rep NA k x 1 length x y lt lagdf x 2 c
  • Cacheline技术浅析

    最近组内有个同事在做cacheline相关的特性 向其学习了一下 对原来的cacheline的理解更近了一步 这里总结一下 请彭超大侠有空的话帮忙在斧正一下 Cache就是对内存的内容进行缓存的一个硬件 cache和内存的逻辑关系结构如下图
  • vue项目中的视频直播插件

    所用插件vue video player 这是一款基于video js的视频播放器插件 插件的使用 安装 npm install vue video player save 全局引入 import Vue from vue import V
  • [NOIP]2004

    题目 链接 https ac nowcoder com acm contest 19859 P 题意 输入 3 10001011 输出 IBFBBBFIBFIIIFF 解析 题目所求 类似于建线段树 完全二叉树 叶子节点有2 n个 如果是叶
  • JAVA:List复制

    ArrayList的复制方法有几种 我们这边分别列出来 并且判断了更改复制的List会不会对原List有影响 初始List ArrayList
  • 测试及时通讯工具

    来自 51Testing软件测试论坛 测试像QQ那样的及时通讯工具 应该如何测试 参考答案 1 首先以核心功能为中心进行测试工作的部署 比如 关键功能或核心功能 收发等等 因为有可能联动一些其他辅助功能 事先进行规划部署 2 综合利用场景分
  • Java中的装包(装箱)和拆包(装包)

    装箱和拆箱 在Java的学习中 我们有的时候会设计装箱和拆箱的概念 也就是常说的装包和拆包 这篇博客将详细讲解一下装箱和拆箱的概念及其用途 装箱 装包 将基本数据类型转换成包装类类型 拆箱 拆包 将包装类类型转换成基本数据类型 装箱 注意
  • 2023年应届生招聘和薪酬管理

    导读 2023年高校毕业生春季招聘正在如火如荼开展 校招选拔 应届生起薪等话题成为企业近期关注的焦点 随着校招需求增加 企业表示招聘难度也有所加大 尤其是热门岗位 紧缺专业和优质生源的应届生 如何制定有吸引力的校招策略和有竞争力的应届生起薪
  • 博客地址 linlin.fun

    暂时不用csdn了 网络太慢了 csdn博客内容已经抓取到linlin fun
  • 基于springboot微服务项目的父工程、common模块的构建

    概述 以微服务项目的方式 对软件体系进行一个简单的探究 简略说明 为什么这样做 软件中这样做的原因是什么 结合一定的案例给出 父工程 对于父工程模块中重要的是其中的pom文件 在微服务体系下 不能够过多 比如在子模块中会自己引入的 就不要在
  • 最长滑雪道-蓝桥杯练习-python实现

    最长滑雪道 问题描述 小袁非常喜欢滑雪 因为滑雪很刺激 为了获得速度 滑的区域必须向下倾斜 而且当你滑到坡底 你不得不再次走上坡或者等待升降机来载你 小袁想知道在某个区域中最长的一个滑坡 区域由一个二维数组给出 数组的每个数字代表点的高度
  • FileZilla Server超详细配置

    FileZilla Server超详细配置 FileZilla Server下载安装完成后 必须启动软件进行设置 由于此软件是英文 本来就是一款陌生的软件 再加上英文 注 本站提供中文版本 请点击下载 配置难度可想而知 站长从网上找到一篇非
  • mac m2 编译dubbo3.1.x版本报Missing:com.google.protobuf:protoc:exe:osx-aarch_64

    原因是低版本的protobuf和grpc不支持MacBook m1或m2 protobuf 需要使用x86的protobuf 解决方法 1 单独修改configuration
  • JavaScript中数组去重的5种方法是什么

    数组去重的5种方法 1 用 new Set arr 语句去重 2 用 Array from new Set arr 语句去重 3 利用indexOf 去重 4 利用includes 去重 5 利用filter 去重 数组去重的方法 1 ne
  • vue this.$emit(‘close‘)

    父页面
  • 【matlab-in-vscode配置流程】在vscode上的逐块编译matlab

    读了 https zhuanlan zhihu com p 616873284 这篇文章 看起来好像很厉害的样子 于是想部署一下matlab in vscode这个插件 遇到了一些坑 于是记录 安装插件 直接在vscode搜索maltab
  • Java 解压压缩文件,springMVC 接收压缩文件

    解压 zip rar 类型的压缩文件 1 首先需要 jar 包 ant 1 6 5 jar 解压zip格式的压缩文件 junrar 0 7 jar 解压rar 格式 如果是 maven