@SuppressWarnings("rawtypes"
)
public
static
void
unZipFiles(File zipFile,String descDir)
throws
IOException
File pathFile
=
new
File(descDir);
if
(!
pathFile.exists())
pathFile.mkdirs();
//
解决zip文件中有中文目录或者中文文件
ZipFile zip =
new
ZipFile(zipFile, Charset.forName("GBK"
));
for
(Enumeration entries =
zip.entries(); entries.hasMoreElements();)
ZipEntry entry
=
(ZipEntry)entries.nextElement();
String zipEntryName
=
entry.getName();
InputStream in
=
zip.getInputStream(entry);
String outPath
= (descDir+zipEntryName).replaceAll("\\*", "/"
);;
//
判断路径是否存在,不存在则创建文件路径
File file =
new
File(outPath.substring(0, outPath.lastIndexOf('/'
)));
if
(!
file.exists())
file.mkdirs();
//
判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
if
(
new
File(outPath).isDirectory())
continue
;
//
输出文件路径信息
System.out.println(outPath);
OutputStream out
=
new
FileOutputStream(outPath);
byte
[] buf1 =
new
byte
[1024
];
int
len;
while
((len=in.read(buf1))>0
)
out.write(buf1,
0
,len);
in.close();
out.close();
System.out.println(
"******************解压完毕********************"
);
解压tar.gz 文件
package com.hou;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.GZIPInputStream;
import org.apache.tools.tar.TarEntry;
import org.apache.tools.tar.TarInputStream;
* 解压tar.gz 文件
* ClassName: Test01
* @Description: TODO
* @author HJJ
* @date 2018年10月17日
public class Test01 {
public static void main(String[] args) {
File file=new File("D:/home/app/data/tiantai/new/pred_2018-10-15.tar.gz");
String str="D:/home/app/data/tiantai/new/";
try {
unTarGz(file,str);
System.out.println("解压成功");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
//------------------------------------------------------------------------------------------------------
* 解压tar.gz 文件
* @param file 要解压的tar.gz文件对象
* @param outputDir 要解压到某个指定的目录下
* @throws IOException
public static void unTarGz(File file,String outputDir) throws IOException{
TarInputStream tarIn = null;
try{
tarIn = new TarInputStream(new GZIPInputStream(
new BufferedInputStream(new FileInputStream(file))),
1024 * 2);
createDirectory(outputDir,null);//创建输出目录
TarEntry entry = null;
while( (entry = tarIn.getNextEntry()) != null ){
if(entry.isDirectory()){//是目录
entry.getName();
createDirectory(outputDir,entry.getName());//创建空目录
}else{//是文件
File tmpFile = new File(outputDir + "/" + entry.getName());
createDirectory(tmpFile.getParent() + "/",null);//创建输出目录
OutputStream out = null;
try{
out = new FileOutputStream(tmpFile);
int length = 0;
byte[] b = new byte[2048];
while((length = tarIn.read(b)) != -1){
out.write(b, 0, length);
}catch(IOException ex){
throw ex;
}finally{
if(out!=null)
out.close();
}catch(IOException ex){
throw new IOException("解压归档文件出现异常",ex);
} finally{
try{
if(tarIn != null){
tarIn.close();
}catch(IOException ex){
throw new IOException("关闭tarFile出现异常",ex);
* 构建目录
* @param outputDir
* @param subDir
public static void createDirectory(String outputDir,String subDir){
File file = new File(outputDir);
if(!(subDir == null || subDir.trim().equals(""))){//子目录不为空
file = new File(outputDir + "/" + subDir);
if(!file.exists()){
if(!file.getParentFile().exists())
file.getParentFile().mkdirs();
file.mkdirs();
3.解压指定目录下的zip文件
* 解压指定目录下的zip文件
* @param checkPath 检测目录,先从缓存中取,如果缓存中不存在,再从配置文件中提取
* @param fileName 待解压的zip文件
* @throws Exception
private static void unzip(String checkPath,String fileName) throws Exception {
if (checkPath.startsWith("~")) {
checkPath = System.getProperty("user.home")+ checkPath.substring(1);
// final String currentPath = checkPath;
final String currentPath = "D:/home/app/data/tiantai/new/";
// String fileRoot = checkPath + File.separator + fileName; //zip文件路径
String fileRoot = "D:/home/app/data/tiantai/new/QUNAR_ONE_COMMON_PRYPAY_1539141468602.zip"; //zip文件路径
//System.out.println("解压的zip文件 fileRoot:" + fileRoot);
System.out.println("解压的zip文件 fileRoot:" + fileRoot);
FileSystem fs = FileSystems.newFileSystem(Paths.get(fileRoot),null);
Files.walkFileTree(fs.getPath("/"),new SimpleFileVisitor<Path>(){ //遍历文件系统时,可获取文件属性
* Invoked for a file in a directory.
* <p> Unless overridden, this method returns {@link FileVisitResult#CONTINUE
* CONTINUE}.
* @param file
* @param attrs
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Path destPath = Paths.get(currentPath,file.toString());
Files.deleteIfExists(destPath);//如果目标文件已经存在,则删除
Files.createDirectories(destPath.getParent());//创建文件的父目录,不管是文件还是目录
Files.move(file, destPath);
return FileVisitResult.CONTINUE;
fs.close();//关闭文件系统
//文件解压成功后,删除zip文件
File delZipFile = new File(fileRoot);
if(delZipFile.exists() && delZipFile.isFile()){
boolean d = delZipFile.delete();
if(d){
// System.out.println(fileRoot + " 文件已删除...");
System.out.println((fileRoot + " 文件已删除..."));
public static void Decompressing2() throws IOException {
// String path = "D:/home/app/data/tiantai/new/";
String path = "D:/home/app/data/tiantai/new/";
ZipEntry zipEntry = null;
try {
// ZipInputStream读取压缩文件
FileInputStream file=new FileInputStream(new File(path+"QUNAR_ONE_COMMON_PRYPAY_1539679543536.zip"));
// ZipFile zipFile = new ZipFile(new File(path+"QUNAR_ONE_COMMON_PRYPAY_1539141468602.zip"),Charset.forName("gbk")) ;
ZipInputStream zipInputStream = new ZipInputStream(file);
// 写入到缓冲流中
BufferedInputStream bufferedInputStream = new BufferedInputStream(zipInputStream);
File fileOut = null;
// 读取压缩文件中的一个文件
// zipEntry = zipInputStream.getNextEntry();
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
// 若当前zipEntry是一个文件夹
if (zipEntry.isDirectory()) {
fileOut = new File(path + "//" +zipEntry.getName());
// 在指定路径下创建文件夹
if (!fileOut.exists()) {
fileOut.mkdirs();
//若是文件
} else {
// 原文件名与指定路径创建File对象(解压后文件的对象)
fileOut = new File(path, zipEntry.getName());
try(
FileOutputStream fileOutputStream = new FileOutputStream(fileOut);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);){
//将文件写入到指定file中
int b = 0;
while ((b = bufferedInputStream.read()) != -1) {
bufferedOutputStream.write(b);
}catch (Exception e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
readByZipInputStream("D:/home/app/data/tiantai/new/QUNAR_ONE_COMMON_PRYPAY_1539065367654.zip", "d:/");
public static void readByZipInputStream(String archive, String decompressDir)
throws FileNotFoundException, IOException {
BufferedInputStream bi;
ZipFile zf = new ZipFile(archive, Charset.forName("gbk"));//支持中文
Enumeration e = zf.entries();
while (e.hasMoreElements()) {
ZipEntry ze2 = (ZipEntry) e.nextElement();
String entryName = ze2.getName();
String path = decompressDir + "/" + entryName;
if (ze2.isDirectory()) {
System.out.println("正在创建解压目录 - " + entryName);
File decompressDirFile = new File(path);
if (!decompressDirFile.exists()) {
decompressDirFile.mkdirs();
} else {
System.out.println("正在创建解压文件 - " + entryName);
String fileDir = path.substring(0, path.lastIndexOf("/"));
File fileDirFile = new File(fileDir);
if (!fileDirFile.exists()) {
fileDirFile.mkdirs();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(
decompressDir + "/" + entryName));
bi = new BufferedInputStream(zf.getInputStream(ze2));
byte[] readContent = new byte[1024];
int readCount = bi.read(readContent);
while (readCount != -1) {
bos.write(readContent, 0, readCount);
readCount = bi.read(readContent);
bos.close();
zf.close();
6.修改文件名
* 通过文件路径直接修改文件名
* @param filePath 需要修改的文件的完整路径
* @param newFileName 需要修改的文件的名称
* @return
public static String FixFileName(String filePath, String newFileName) {
File f = new File(filePath);
if (!f.exists()) { // 判断原文件是否存在
return null;
newFileName = newFileName.trim();
if ("".equals(newFileName) || newFileName == null) // 文件名不能为空
return null;
String newFilePath = null;
if (f.isDirectory()) { // 判断是否为文件夹
newFilePath = filePath.substring(0, filePath.lastIndexOf("/")) + "/" + newFileName;
} else {
newFilePath = filePath.substring(0, filePath.lastIndexOf("/"))+ "/" + newFileName ;
File nf = new File(newFilePath);
if (!f.exists()) { // 判断需要修改为的文件是否存在(防止文件名冲突)
return null;
try {
f.renameTo(nf); // 修改文件名
} catch(Exception err) {
err.printStackTrace();
return null;
return newFilePath;