《如何处理压缩文件》

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()方法写入字节内容,并捕获异常。

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值