Java便捷式处理后缀为(.zip或.rar)的压缩文件

  • .zip文件读取操作


从文件系统中读取一个名为 " F:\\1001.zip " 的文件

尝试每次读取1个字节的数据块,输出每次读取的字节数

(1)创建一个 FileInputStream 对象来读取该文件,使用try-catch块捕获异常处理

(2)使用 FileInputStream 对象的read()方法进行对压缩包的读取操作。

** : int data = -1;用于存储每次从文件中读取的字节。初始值设为-1,因为文件读取结束时的返回值也是-1。


尝试每次读取128个字节的数据块,输出读取到的字节数组的内容

(1)初始化一个字节数组 buff ,大小为128字节,用于存储每次从文件中读取的数据

(2)进入一个循环,使用 in.read(buff) 方法尝试从文件中读取最多128个字节到 buff 数组中。该方法返回实际读取的字节数,如果到达文件末尾,则返回-1

(3)在循环内部,使用 System.out.printf 输出每次读取的字节数( len )和整个 buff 数组的内容(使用 Arrays.toString(buff) 转换)

  • .zip文件解压缩操作

(1)根据原始路径(字符串),创建源文件(File对象)

(2)源文件调用getName()方法获取文件名,再利用File类创建根目录rir使其与压缩文件在同一目录下,并利用substring()方法对文件名进行截取,去除后缀,完成创建解压后的同名空目录文件夹。

(3)rootDir调用exists()方法、mkdir()方法判断解压文件夹是否存在,没有则创建,有则删除重新创建。

**注意: 此时已完成解压操作,但解压完后的文件内无内容,仍需进行将压缩包里的内容写进此中!!

(1)使用ZipInputStream进行对zip格式的压缩文件输入流,遍历压缩包中的每个子目录或者子文件,获取其名称并创建(目录则创建子目录,文件则创建子文件)。

(2)通过FileOutputStream的对象读取当前压缩包里的文件,并通过输出流写入新子文件中。

  • .rar文件解压缩操作

**注意: 同解压缩.zip的文件步骤大致相同,略微处注意!!

(1)创建解压缩的根目录rootDir,并判断其是否已经存在,存在则删除,并创建新的rootDir。

(2).zip用的是ZipEntry进行对压缩包每个子目录或子文件的遍历,而.rar通过创建Archive压缩包对象,用来读取rar压缩文件格式,用FileHeader对象来获取压缩文件中的所有子目录或子文件。

(3)通过调用sort方法,对子目录或者子文件进行排序。用for循环遍历子目录或子文件,并根据类型不同调用不同的创建方法。

(4)从压缩包中获取一个子文件的输入流, getInputStream(fd) 方法返回一个 InputStream 对象,可以使用这个对象来读取压缩包中的子文件。并使用 Apache Commons IO 库中的 FileUtils 类来复制输入流 in (即压缩包中的子文件)到一个新文件 f。

**注意 :一定要记得catch块中的抛出异常,否则程序会报错!!!

  • 案例(作业抄袭)分析:

对于提交的两个作业进行审核,查看是否有抄袭的可能存在?

思路: 通过计算两个文件的哈希值,并转换成16进制后进行比较,若相同,则可能会抄袭。

(1)读取路径1、2对应文件的所有字节数据。

(2) MessageDigest 是 Java 提供的一个用于计算消息摘要(哈希值)的类,通过调用Message . getDigest 类的 getInstance 方法,并传入"md5"作为参数,来获取一个 MD5 算法的实例。

(3)M essageDigest 使用 update 方法将输入的字节数组 bytes 更新到要计算的消息摘要中,通过调用 digest 方法,计算输入数据的哈希值,并将结果存储在字节数组 hashBytes 中。

(4)通过一个循环遍历 hashBytes 数组,并使用 String.format("%02x", b) 将每个字节转换为两位十六进制数。通过 ret.toString() StringBuilder 对象转换为字符串,并返回该字符串作为方法的输出。

  • 案例分析2(是否有重复文件):

(1)在 main 方法中,使用 Files.walkFileTree 方法遍历指定目录下的所有文件和目录

(2)自定义文件访问器 MyFileVisitor 继承自 SimpleFileVisitor<Path> 并重写了 visitFile 方法来处理遍历到的每个文件

(3)使用 HashMap<String,Path> 来存储每个哈希值及其对应的文件路径。如果 map.put(hash,file) 返 回 非 空,说明之前已经有文件具有相同的哈希值,即找到了重复的文件。 如果找到重复的文件,就打印出这两个文件的路径。

  • 压缩文件.zip

(1)创建所在目录,调用listFiles()方法遍历所有原始子文件。

(2)通过ZipOutStream创建zip压缩文件的输出流,并写一个for循环,用来将原始文件写入一个压缩包中的子文件,并通过对象调用write()方法写入字节内容,并捕获异常。

**注意: 使用完后要关闭压缩包中的内容。