《压缩文件的解析方式》

常见压缩文件格式:

压缩文件可以采用多种不同的格式进行存储,每种格式都有其特点和适用场景。

  • zip:最常见的压缩文件格式之一,Windows系统内置了对zip格式的支持。
  • rar:另一种广泛使用的压缩文件格式,具有较高的压缩率。
	String path = "F:\\tt\\实验案例.rar";
		//	String path = "F:\\tt\\实验案例.zip";
		if (path.endsWith(".zip")) {
			unzip(path);
		} else if (path.endsWith(".rar")) {
			unrar(path);
		}

一、这段代码实现了zip格式文件的【解压】功能。

它首先检查解压目标目录是否存在,如果存在则删除,然后创建新的目录。接着,它使用【ZipInputStream】读取zip文件,并遍历其中的所有条目。对于每个条目,它会在目标目录中创建相应的文件或目录,并将条目内容写入新创建的文件中。如果在处理过程中发生异常,它会打印堆栈跟踪。

unzip 方法的实现步骤:

  1. 创建源文件对象
    • 根据提供的路径创建一个 File 对象,表示要解压的 ZIP 文件。
  2. 确定解压目录
    • 从 ZIP 文件名中去除扩展名,得到解压后的根目录名。
    • 在 ZIP 文件所在的父目录中创建这个根目录。
  3. 删除已存在的解压目录
    • 如果解压目录已经存在,则使用 FileUtils.deleteDirectory 方法删除它。
  4. 创建解压目录
    • 使用 mkdir 方法创建解压后的根目录。
  5. 解压 ZIP 文件
    • 使用 ZipInputStream 读取 ZIP 文件。
    • 遍历 ZIP 文件中的每个条目(子目录或子文件)。
    • 对于每个条目,创建一个对应的 File 对象,并在物理磁盘上创建相应的子目录或子文件。
    • 如果条目是文件,则读取其内容并写入新创建的文件中。
  6. 异常处理
    • 捕获并处理可能发生的 FileNotFoundException 和 IOException
	// 解压缩zip格式的方法
	public static void unzip(String path) {
		// 根据原始路径(字符串),创建源文件(File对象)
		File sourceFile = new File(path);

		// 根目录
		String sourceFileName = sourceFile.getName();
		File rootDir = new File(
				sourceFile.getParent() + "\\" + sourceFileName.substring(0, sourceFileName.lastIndexOf(".")));

		// 判断根目录是否已经存在
		if (rootDir.exists()) {
			// 如果存在,则删除
			// rootDir.delete();//仅能删除空目录

			// 使用commons-io包提供的FileUtils工具类进行删除
			try {
				FileUtils.deleteDirectory(rootDir);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		// 创建根目录
		rootDir.mkdir();

		// ZipInputStream:用于进行zip格式的压缩文件输入流
		try (ZipInputStream in = new ZipInputStream(new FileInputStream(sourceFile))) {

			// 遍历压缩包中的每个子目录或子文件(ZipEntry类型的对象)
			ZipEntry zipEntry = null;
			while ((zipEntry = in.getNextEntry()) != null) {
				// 创建子目录或子文件(File对象)
				File file = new File(rootDir.getPath() + "\\" + zipEntry.getName());

				if (zipEntry.isDirectory()) {
					// 物理磁盘创建子目录
					file.mkdir();
				} else {
					// 物理磁盘创建子文件
					file.createNewFile();

					// 读取当前压缩包中的子文件,并通过输出流out写入新子文件中
					try (FileOutputStream out = new FileOutputStream(file);) {
						byte[] buff = new byte[1024];
						int len = -1;
						while ((len = in.read(buff)) != -1) {
							out.write(buff, 0, len);
						}
					}
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

一、这段代码实现了rar格式文件的【解压】功能。

这个方法首先创建了一个解压目录,然后读取RAR文件中的所有子目录和子文件,按照文件名排序,遍历列表,为每个子目录或子文件创建对应的目录或文件,并将RAR文件中的子文件内容复制到新创建的文件中,最后打印所有子目录或子文件的名称。如果在解压过程中发生异常,则打印异常堆栈。

unrar 方法的实现步骤:

  1. 创建解压目录
    • 类似于 unzip 方法,根据 RAR 文件名确定解压后的根目录名,并在父目录中创建它。
  2. 删除已存在的解压目录
    • 如果解压目录已经存在,则使用 FileUtils.deleteDirectory 方法删除它。
  3. 读取 RAR 文件
    • 使用 Archive 类(来自某个 RAR 处理库)读取 RAR 文件。
  4. 获取文件头列表
    • 从 RAR 文件中获取所有子目录和子文件的文件头列表。
  5. 排序文件头列表
    • 根据文件名对文件头列表进行排序。
  6. 解压 RAR 文件
    • 遍历排序后的文件头列表。
    • 对于每个文件头,创建一个对应的 File 对象,并在物理磁盘上创建相应的子目录或子文件。
    • 如果文件头是文件,则获取其输入流,并将内容复制到新创建的文件中。
  7. 打印文件名
    • 遍历文件头列表,打印每个子目录或子文件的名称。
  8. 异常处理
    • 捕获并处理可能发生的 RarException 和 IOException
// 解压缩rar格式
	public static void unrar(String path) {
		// 1.创建解压缩的根目录
		File rarFile = new File(path);
		File rootDir = new File(
				rarFile.getParent() + "\\" + rarFile.getName().substring(0, rarFile.getName().lastIndexOf(".")));
		if (rootDir.exists()) {
			try {
				FileUtils.deleteDirectory(rootDir);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		rootDir.mkdir();

		// 创建Archive对象,用于读取rar压缩文件格式
		try (Archive archive = new Archive(new FileInputStream(path))) {

			// 获取压缩文件中的所有子目录或子文件(FileHeader对象)
			List<FileHeader> fileheaderList = archive.getFileHeaders();

			// 按照子目录(子文件)名称排序
			fileheaderList.sort(new Comparator<FileHeader>() {

				@Override
				public int compare(FileHeader o1, FileHeader o2) {
					return o1.getFileName().compareTo(o2.getFileName());
				}
			});

			for (FileHeader fd : fileheaderList) {
				File f = new File(rootDir.getPath() + "\\" + fd.getFileName());

				if (fd.isDirectory()) {
					// 创建新子目录
					f.mkdir();
				} else {
					// 创建新子文件
					f.createNewFile();

					// 获取压缩包中的子文件输入流
					InputStream in = archive.getInputStream(fd);

					// 复制文件输入流至新子文件
					FileUtils.copyInputStreamToFile(in, f);
				}
			}

			for (FileHeader fd : fileheaderList) {
				System.out.println(fd.getFileName());
			}
		} catch (RarException | IOException e) {
			e.printStackTrace();
		}

这两个方法都遵循了类似的步骤:创建解压目录、删除已存在的解压目录(如果需要)、读取压缩文件、遍历压缩文件中的条目、在物理磁盘上创建对应的子目录或子文件,并处理可能发生的异常。

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SHP文件是存储地理空间数据的一种常见的GIS矢量数据格式。通常情况下,SHP文件是由多个文件组成的集合,包括.shp、.shx和.dbf文件。其中,.shp文件包含了空间几何对象的几何信息,.shx文件是shp文件的索引文件,用于快速访问.shp文件中的几何对象,.dbf文件则存储了与几何对象相关的属性数据。 要对SHP文件进行解析,首先需要了解其文件结构。可以使用第三方库或软件进行解析,如GDAL、ArcGIS、QGIS等。以GDAL为例,可以使用GDAL库中的Open函数读取.shp文件,并获取其中的几何对象和属性数据。通过对shp文件的读取,可以了解其坐标系信息、几何对象类型(如点、线、面等)、坐标点的位置等。 对于压缩的SHP文件,通常是将多个SHP文件进行压缩打包而成的。解析时需要先解压缩文件,即还原出原始的.shp、.shx和.dbf文件。然后再按照上述方法对解压缩后的文件进行解析。 在解析SHP文件时,还可以进行一些其他的操作,比如对空间几何对象进行空间分析、属性查询等。通过解析SHP文件,可以获取到地理数据中的几何信息和属性信息,进而进行地理空间分析和可视化等操作。 总之,解析SHP文件是指对其文件结构进行解析,提取出其中的几何对象和属性数据。通过了解SHP文件的文件结构和使用相关的库或软件,可以对SHP文件进行解析和进一步的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值