java 如何判断文件为压缩包

java 如何判断文件为压缩包,第1张

可缓洞以直接通过size方法获取到文件的个数:

引入的包:

import java.util.zip

方法代码:

ZipFile zf = new ZipFile("F:\纤悄\记事本.zip")

int c= zf.size()//返回zip文件中的扰竖枯条目数

System.out.print(c)

分类: 电脑/网络 >>程序设早辩计 >>其他编程语言

问题描述:

JAVA 程序中如码睁姿何实现对RAR压缩包文件中文件格式的判断?

解析:

JAVA中使用java.util.zip.ZipOutputStream在对文件进行压缩时,将把每一个文件实体封装为java.util.zip.ZipEntry,反之,在使用java.util.zip.ZipInputStream在对文件进行解压缩时,每个文件迟绝的访问也是通过访问ZipEntry对象来 *** 作的,可以通过ZipEntry对象的getName()来得到当初压缩时对该文件的命名(通常为该文件相对路径),当然得到了该文件命名自然就可以对文件格式进行判断了!

有三种方式实现java压缩:

1、jdk自带的包java.util.zip.ZipOutputStream,不足之处,文件(扮纯夹)名称带中文时指尺,出现乱码问题,实现代码如下:

/**

* 功能:把 sourceDir 目录下的所有文件进行 zip 格式的压缩,保存为指定 zip 文件

* @param sourceDir 如果是目录,eg:D:\\MyEclipse\\first\\testFile,则压缩目录下所有文件;

* 如果是文件,eg:D:\\MyEclipse\\first\\testFile\\aa.zip,则只压缩本文件

* @param zipFile 最后压缩的文件路厅逗咐径和名称,eg:D:\\MyEclipse\\first\\testFile\\aa.zip

*/

public File doZip(String sourceDir, String zipFilePath) throws IOException {

File file = new File(sourceDir)

File zipFile = new File(zipFilePath)

ZipOutputStream zos = null

try {

// 创建写出流 *** 作

OutputStream os = new FileOutputStream(zipFile)

BufferedOutputStream bos = new BufferedOutputStream(os)

zos = new ZipOutputStream(bos)

String basePath = null

// 获取目录

if(file.isDirectory()) {

basePath = file.getPath()

}else {

basePath = file.getParent()

}

zipFile(file, basePath, zos)

}finally {

if(zos != null) {

zos.closeEntry()

zos.close()

}

}

return zipFile

}

/**

* @param source 源文件

* @param basePath

* @param zos

*/

private void zipFile(File source, String basePath, ZipOutputStream zos)

throws IOException {

File[] files = null

if (source.isDirectory()) {

files = source.listFiles()

} else {

files = new File[1]

files[0] = source

}

InputStream is = null

String pathName

byte[] buf = new byte[1024]

int length = 0

try{

for(File file : files) {

if(file.isDirectory()) {

pathName = file.getPath().substring(basePath.length() + 1) + "/"

zos.putNextEntry(new ZipEntry(pathName))

zipFile(file, basePath, zos)

}else {

pathName = file.getPath().substring(basePath.length() + 1)

is = new FileInputStream(file)

BufferedInputStream bis = new BufferedInputStream(is)

zos.putNextEntry(new ZipEntry(pathName))

while ((length = bis.read(buf)) >0) {

zos.write(buf, 0, length)

}

}

}

}finally {

if(is != null) {

is.close()

}

}

}

2、使用org.apache.tools.zip.ZipOutputStream,代码如下,

package net.szh.zip

import java.io.BufferedInputStream

import java.io.File

import java.io.FileInputStream

import java.io.FileOutputStream

import java.util.zip.CRC32

import java.util.zip.CheckedOutputStream

import org.apache.tools.zip.ZipEntry

import org.apache.tools.zip.ZipOutputStream

public class ZipCompressor {

static final int BUFFER = 8192

private File zipFile

public ZipCompressor(String pathName) {

zipFile = new File(pathName)

}

public void compress(String srcPathName) {

File file = new File(srcPathName)

if (!file.exists())

throw new RuntimeException(srcPathName + "不存在!")

try {

FileOutputStream fileOutputStream = new FileOutputStream(zipFile)

CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,

new CRC32())

ZipOutputStream out = new ZipOutputStream(cos)

String basedir = ""

compress(file, out, basedir)

out.close()

} catch (Exception e) {

throw new RuntimeException(e)

}

}

private void compress(File file, ZipOutputStream out, String basedir) {

/* 判断是目录还是文件 */

if (file.isDirectory()) {

System.out.println("压缩:" + basedir + file.getName())

this.compressDirectory(file, out, basedir)

} else {

System.out.println("压缩:" + basedir + file.getName())

this.compressFile(file, out, basedir)

}

}

/** 压缩一个目录 */

private void compressDirectory(File dir, ZipOutputStream out, String basedir) {

if (!dir.exists())

return

File[] files = dir.listFiles()

for (int i = 0i <files.lengthi++) {

/* 递归 */

compress(files[i], out, basedir + dir.getName() + "/")

}

}

/** 压缩一个文件 */

private void compressFile(File file, ZipOutputStream out, String basedir) {

if (!file.exists()) {

return

}

try {

BufferedInputStream bis = new BufferedInputStream(

new FileInputStream(file))

ZipEntry entry = new ZipEntry(basedir + file.getName())

out.putNextEntry(entry)

int count

byte data[] = new byte[BUFFER]

while ((count = bis.read(data, 0, BUFFER)) != -1) {

out.write(data, 0, count)

}

bis.close()

} catch (Exception e) {

throw new RuntimeException(e)

}

}

}

3、可以用ant中的org.apache.tools.ant.taskdefs.Zip来实现,更加简单。

package net.szh.zip

import java.io.File

import org.apache.tools.ant.Project

import org.apache.tools.ant.taskdefs.Zip

import org.apache.tools.ant.types.FileSet

public class ZipCompressorByAnt {

private File zipFile

public ZipCompressorByAnt(String pathName) {

zipFile = new File(pathName)

}

public void compress(String srcPathName) {

File srcdir = new File(srcPathName)

if (!srcdir.exists())

throw new RuntimeException(srcPathName + "不存在!")

Project prj = new Project()

Zip zip = new Zip()

zip.setProject(prj)

zip.setDestFile(zipFile)

FileSet fileSet = new FileSet()

fileSet.setProject(prj)

fileSet.setDir(srcdir)

//fileSet.setIncludes("**/*.java")包括哪些文件或文件夹 eg:zip.setIncludes("*.java")

//fileSet.setExcludes(...)排除哪些文件或文件夹

zip.addFileset(fileSet)

zip.execute()

}

}

测试一下

package net.szh.zip

public class TestZip {

public static void main(String[] args) {

ZipCompressor zc = new ZipCompressor("E:\\szhzip.zip")

zc.compress("E:\\test")

ZipCompressorByAnt zca = new ZipCompressorByAnt("E:\\szhzipant.zip")

zca.compress("E:\\test")

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12244475.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存