具体的创建方法参照下面的实例:
public class FileTest {
public static void main(String[] args) {
// 根据系统的实际情况选择目录分隔符(windows下是,linux下是/)
String separator = File.separator
String directory = "myDir1" + separator + "myDir2"
// 以下这句的效果等同于上面两句,windows下正斜杠/和反斜杠都是可以的
// linux下只认正斜杠,为了保证跨平台性,不建议使用反斜杠(在java程序中是转义字符,用\来表示反斜杠)
// String directory = "myDir1/myDir2"
String fileName = "myFile.txt"
// 在内存中创建一个文件对象,注意:此时还没有在硬盘对应目录下创建实实在在的文件
File f = new File(directory,fileName)
if(f.exists()) {
// 文件已经存在,输出文件的相关信息
System.out.println(f.getAbsolutePath())
System.out.println(f.getName())
System.out.println(f.length())
} else {
// 先创建文件所在的目录
f.getParentFile().mkdirs()
try {
// 创建新文件
f.createNewFile()
} catch (IOException e) {
System.out.println("创建新文件时出现了错误。。。")
e.printStackTrace()
}
}
}
}
有三种方式实现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")
}
}