`
wen866595
  • 浏览: 268348 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java7 Zip file system, FileVisitor

    博客分类:
  • java
阅读更多

 

Java7 的文件API可以把zip、jar文件看作是一个文件系统,访问文件系统都可以使用Path及相关的类进行。

 

下面是创建zip压缩文件的示例:

	private static void create() {
		Map<String, String> env = new HashMap<>();
		env.put("create", "true"); // 如果zip文件不存在则创建

		// 父目录的文件夹必须已创建,否则抛出异常。zip文件可以未创建
		URI uri = URI
				.create("jar:file:/H:/java/learn/java7/zipfilesystem/testzipfs.zip");

		try (FileSystem zipfs = FileSystems.newFileSystem(uri, env);) {

			Path externalPath = Paths.get("H:/java/jdk7/COPYRIGHT");

			// 创建zip文件里的目录
			Path zipDir = zipfs.getPath("abc/xyz");
			Files.createDirectories(zipDir);

			System.out.println("zipDir: " + zipDir);

			// 路径必须是已创建。
			Path contentFile = zipfs.getPath("abc/xyz", "copyRight");

			Files.copy(externalPath, contentFile);

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

 

这个代码片段也展示了Java7的其他一些特性:

1、泛型的简写: Map<String, String> env = new HashMap<> ();

2、try-with-closeable:try (FileSystem zipfs = FileSystems.newFileSystem(uri, env);) {

FileSystem类实现了Closeable类,不再需要手动显示关闭。

 

 

在目前的测试中发现,如果要压缩有层次结构的文件时,如zip里有目录:abc/xyz/123.txt,需要预先建立abc/xyz目录,否则会抛出异常。 Map参数里的create属性为true只表示最后的那个文件(123.txt)不存在时创建。

这好像还不如ZipFile与ZipEntry的组合好用。

 

 

 

有了FileSystem实例后,就可以像访问本地的文件系统一样简单。下面的代码解压前面建立的zip文件里的文件到本地目录。

 

下面的代码实现了FileVisitor接口,把指定zip的path下的内容解压到saveDir的对应目录下:

	private static void walkZipPath(final String saveDir, Path path)
			throws IOException {

		FileVisitor<Path> fv = new FileVisitor<Path>() {
			@Override
			public FileVisitResult preVisitDirectory(Path dir,
					BasicFileAttributes attrs) throws IOException {
				// 创建本地目录
				new File(saveDir, dir.toString()).mkdirs();

				return FileVisitResult.CONTINUE;
			}

			@Override
			public FileVisitResult visitFile(Path file,
					BasicFileAttributes attrs) throws IOException {
				// 创建本地文件路径
				Path Localtarget = Paths.get(saveDir, file.toString());

				// 拷贝到本地文件系统
				Files.copy(file, Localtarget,
						StandardCopyOption.REPLACE_EXISTING);

				return FileVisitResult.CONTINUE;
			}

			@Override
			public FileVisitResult visitFileFailed(Path file, IOException exc)
					throws IOException {

				exc.printStackTrace();

				return FileVisitResult.TERMINATE;
			}

			@Override
			public FileVisitResult postVisitDirectory(Path dir, IOException exc)
					throws IOException {
				// 不为空表示出错
				if (exc != null) {
					exc.printStackTrace();
					return FileVisitResult.TERMINATE;
				}

				return FileVisitResult.CONTINUE;
			}
		};

		Files.walkFileTree(path, fv);
	}
 

下面的代码根据zip文件建立一个新的文件系统,并进行访问:

	private static void extractZip() {
		String uri = "H:/java/learn/java7/zipfilesystem/testzipfs.zip";
		Path path = Paths.get(uri);

		String saveDir = "H:/java/learn/java7/zipfilesystem";

		try (FileSystem fs = FileSystems.newFileSystem(path, null);) {

			for (Path path2 : fs.getRootDirectories()) {
				walkZipPath(saveDir, path2);
			}

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
 

java7的新的文件API与Apache Commons IO包的功有很多相似的地方。

 

 

 

 

 

 

分享到:
评论

相关推荐

    java读取zip文件

    在Java编程环境中,读取ZIP文件是一项常见的任务,特别是在处理归档数据或打包资源时。以下将详细讲解如何使用Java来实现这一功能。 首先,Java提供了`java.util.zip`包,该包包含了处理ZIP文件所需的类,如`...

    基于Java向zip压缩包追加文件

    在Java编程中,向现有的ZIP压缩包追加文件通常需要经过解压、修改、再压缩的步骤,因为标准的Java ZIP库(如`java.util.zip`包)并不直接支持追加到已存在的ZIP文件。本篇文章将深入探讨如何实现这个功能,主要关注...

    java压缩zip文件解决中文乱码问题

    在Java编程中,处理文件压缩和解压是常见的任务,特别是使用ZIP格式。然而,当涉及到包含中文字符的文件或目录时,可能会遇到乱码问题。这个问题主要源于字符编码的不一致,通常需要正确设置字符集来确保中文字符在...

    File_System_Auditor2.53+keygen已测08R2+2012R2

    《Windows文件系统审计工具——File_System_Auditor2.53深度解析》 在IT管理领域,特别是企业网络环境中,确保数据安全与合规性至关重要。File_System_Auditor是一款专门针对Windows文件系统的审计工具,其最新版本...

    JAVA 上传ZIP,RAR文件并解压

    在Java编程环境中,上传并处理ZIP和RAR压缩文件是一项常见的任务,特别是在文件传输、数据存储以及备份场景下。本文将详细讲解如何实现这个功能,包括文件上传、实时进度跟踪、指定解压路径以及解压过程。 首先,让...

    zipJava.zip

    本篇将深入讲解如何使用Java实现将文件打包成ZIP的过程,主要围绕"zipJava.zip"中的核心源码文件"ZipWriter.java"展开。 首先,我们需要了解Java的`java.util.zip`包,这个包提供了处理ZIP文件的类,如`...

    Java解压zip,rar,7z的jar包

    在Java中,处理.zip、.rar和.7z等压缩格式通常需要借助第三方库,因为Java标准库JDK并不直接支持这些格式。本文将详细介绍如何使用特定的jar包来实现对这三种压缩格式的操作。 首先,.zip格式是Java标准库支持的,...

    java加密解密zip压缩包

    为了实现ZIP文件的加密,我们需要依赖第三方库,例如Apache Commons Compress或者Java 7及以上版本引入的`java.nio.file`和`java.util.zip`中的`ZipFile`和`ZipEntry`类。 对于ZIP 2.0加密,Apache Commons ...

    虎牙小游戏服务端-java.zip

    虎牙小游戏服务端_java.zip虎牙小游戏服务端_java.zip虎牙小游戏服务端_java.zip 虎牙小游戏服务端_java.zip虎牙小游戏服务端_java.zip虎牙小游戏服务端_java.zip 虎牙小游戏服务端_java.zip虎牙小游戏服务端_java....

    使用java处理zip文件

    在Java 7及以上版本,可以使用try-with-resources语句自动关闭流。 总的来说,Java提供的`java.util.zip`包使得处理ZIP文件变得简单易行。无论你是要解压文件、创建新的ZIP文件,还是在现有ZIP文件中添加或删除条目...

    Zip File jazzlib.rar

    《深入理解Zip File格式与jazzlib库》 在信息技术领域,数据压缩是常见的操作,其中Zip文件格式是最广泛使用的压缩格式之一。Zip文件能够将多个文件或目录打包成一个单一的可移动文件,便于存储、传输和分享。本文...

    Java安装.zipJava安装.zip

    java安装:Java安装.zipJava安装.zipJava安装.zipJava安装.zipJava安装.zipJava安装.zipJava安装.zipJava安装.zipJava安装.zipJava安装.zipJava安装.zipJava安装.zipJava安装.zipJava安装.zipJava安装.zipJava安装....

    使用java代码替换zip内的文件.docx

    在Java编程中,有时我们需要对已经存在的ZIP文件进行操作,比如替换其中的某个文件,而无需将整个ZIP文件解压后再重新压缩。这样的需求在处理大量数据或优化性能时尤其重要,因为它避免了创建临时文件和多次I/O操作...

    javazip

    Java Zip是Java编程语言中处理压缩文件的一种技术,主要用于创建、读取和更新ZIP格式的文件。ZIP是一种广泛使用的文件存档格式,它允许将多个文件和目录打包成一个单一的压缩文件,便于存储和传输。在Java中,我们...

    基于java的开发源码-iCHAT聊天室基于Java.zip

    基于java的开发源码-iCHAT聊天室基于Java.zip 基于java的开发源码-iCHAT聊天室基于Java.zip 基于java的开发源码-iCHAT聊天室基于Java.zip 基于java的开发源码-iCHAT聊天室基于Java.zip 基于java的开发源码-iCHAT聊天...

    基于java的开发源码-CKFinder文件管理器for Java.zip

    基于java的开发源码-CKFinder文件管理器for Java.zip 基于java的开发源码-CKFinder文件管理器for Java.zip 基于java的开发源码-CKFinder文件管理器for Java.zip 基于java的开发源码-CKFinder文件管理器for Java.zip ...

    java 读取zip Demo

    Java 读取ZIP文件是Java开发中常见的任务,主要用于处理归档数据,如打包和压缩文件。在Java中,我们可以使用内置的`java.util.zip`包来读取和操作ZIP文件。下面将详细介绍如何使用Java读取ZIP文件,并提供相关的...

    java实现zip压缩文件

    ### Java 实现ZIP压缩文件详解 #### 一、概述 在日常开发工作中,对文件进行压缩处理是一项常见的需求。本文将详细介绍如何使用Java语言来实现文件或文件夹的ZIP格式压缩。通过本教程,读者可以了解到Java标准库...

    Java通用解压代码(RAR5,Zip,7Z)

    在Java编程环境中,解压不同类型的压缩文件,如RAR5、Zip和7z,是一项常见的任务。为了实现这一功能,我们需要使用特定的库,因为Java标准库并不直接支持RAR5和7z格式。这里我们将详细探讨如何使用Java来处理这些...

    大创java后端.zip大创java后端.zip

    大创java后端.zip大创java后端.zip大创java后端.zip大创java后端.zip大创java后端.zip大创java后端.zip大创java后端.zip大创java后端.zip大创java后端.zip大创java后端.zip大创java后端.zip大创java后端.zip大创java...

Global site tag (gtag.js) - Google Analytics