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)MessageDigest
使用 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()方法写入字节内容,并捕获异常。
**注意:使用完后要关闭压缩包中的内容。