package com.shd.biz.dataManagement.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributeView;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.web.multipart.MultipartFile;
import com.shd.core.basebiz.dto.DataRecord;
/**
*
* @function 文件操作工具类
* @author Liangjw
* @date 2019-5-9 上午11:10:57
* @version
* @since JDK 1.7
*/
public class FileUtil {
/**
*
* @function 删除文件.
* @author Liangjw
* @date 2019-5-9 上午10:27:32
* @param file 文件
* @return
*/
public static boolean deleteFile(File file){
boolean msg = true;
if(file.exists()){
if(file.isDirectory()){
File[] files = file.listFiles();
if(files != null && files.length > 0){
for(File temp : files){
msg = deleteFile(temp);
if(!msg){
return msg;
}
}
}
msg = file.delete();
}else{
msg = file.delete();
}
}
return msg;
}
/**
*
* @function 保存文件到指定目录.
* @author Liangjw
* @date 2019-5-9 上午10:03:45
* @param file 文件
* @param savePath 上传路径
* @return
* @throws Exception
*/
public static String saveUploadFile(MultipartFile file, String savePath) throws Exception{
File fileDir = new File(savePath);
if(!fileDir.exists()){
fileDir.mkdirs();
}
String filePath = "";
String fileName = file.getOriginalFilename();
fileName = fileName.replaceAll(" ","");
filePath = savePath + File.separator + fileName;
InputStream ins = file.getInputStream();
OutputStream orious = new FileOutputStream(filePath);
try {
byte[] buffer = new byte[4096];
int len = 0;
while ((len = ins.read(buffer)) > -1) {
orious.write(buffer, 0, len);
}
}finally {
orious.flush();
orious.close();
ins.close();
}
return filePath;
}
/**
*
* @function 保存文件到指定目录,并以新名称命名.
* @author Liangjw
* @date 2019-5-23 上午11:30:43
* @param file 文件
* @param savePath 保存目录
* @param newFileName 新名称
* @return
* @throws Exception
*/
public static String saveUploadFile(MultipartFile file, String savePath, String newFileName) throws Exception{
File fileDir = new File(savePath);
if(!fileDir.exists()){
fileDir.mkdirs();
}
String filePath = savePath + File.separator + newFileName;
File oldFile = new File(filePath);
if(oldFile.exists()){
oldFile.delete();
}
InputStream ins = file.getInputStream();
OutputStream orious = new FileOutputStream(filePath);
try {
byte[] buffer = new byte[4096];
int len = 0;
while ((len = ins.read(buffer)) > -1) {
orious.write(buffer, 0, len);
}
}finally {
orious.flush();
orious.close();
ins.close();
}
return filePath;
}
/**
*
* @function 复制文件内容到新的文件.
* @author Liangjw
* @date 2019-5-15 上午10:23:39
* @param oldFile 旧文件
* @param newFilePath 新文件路径
* @return
* @throws Exception
*/
public static String copyFile(File oldFile, String newFilePath) throws Exception{
File tempFile = new File(newFilePath);
if(!tempFile.getParentFile().exists()){
tempFile.getParentFile().mkdirs();
}
if(!tempFile.exists()){
tempFile.createNewFile();
}
InputStream ins = new FileInputStream(oldFile);
OutputStream orious = new FileOutputStream(tempFile);
try {
byte[] buffer = new byte[4096];
int len = 0;
while ((len = ins.read(buffer)) > -1) {
orious.write(buffer, 0, len);
}
return "成功";
} catch(Exception e){
return "失败";
} finally {
orious.flush();
orious.close();
ins.close();
}
}
/**
*
* @function 返回某个路径下所有文件(包括子目录下的所有文件).
* @author Liangjw
* @date 2019-5-10 下午02:47:01
* @param path 访问路径
* @return
* @throws Exception
*/
public static List<File> getFilesByPath(String path) throws Exception{
List<File> result = new ArrayList<File>();
File resultFile = new File(path);
if(resultFile.isDirectory()){
File[] files = resultFile.listFiles();
for(File file : files){
if(file.isDirectory()){
result.addAll(getFilesByPath(file.getAbsolutePath()));
}else{
result.add(file);
}
}
}else{
result.add(resultFile);
}
return result;
}
/**
*
* @function 返回某个路径下所有文件的路径(包括子目录下的所有文件).
* @author Liangjw
* @date 2019-5-24 上午11:24:48
* @param path 访问路径
* @return
* @throws Exception
*/
public static List<String> getFilePathsByPath(String path) throws Exception{
List<String> result = new ArrayList<String>();
File resultFile = new File(path);
if(resultFile.isDirectory()){
File[] files = resultFile.listFiles();
for(File file : files){
if(file.isDirectory()){
result.addAll(getFilePathsByPath(file.getAbsolutePath()));
}else{
result.add(file.getAbsolutePath());
}
}
}else{
result.add(resultFile.getAbsolutePath());
}
return result;
}
/**
*
* @function 获取该路径下一个合适的文件名(当创建文件出现同名时使用,返回一个唯一名称).
* @author Liangjw
* @date 2019-5-24 下午04:55:34
* @param path 文件保存路径
* @param fileName 文件名
* @return
*/
public static String getSuitableFileName(String path, String fileName){
if(new File(path + File.separator + fileName).exists()){
int i = 1;
String pre = fileName.substring(0, fileName.indexOf("."));
String next = fileName.substring(fileName.indexOf("."), fileName.length());
while(new File(path + File.separator + pre + "_" + i + next).exists()){
i++;
}
return pre + "_" + i + next;
}else{
return fileName;
}
}
/**
*
* @function 解析txt文件,返回航点列表.
* @author Liangjw
* @date 2019-5-13 下午02:21:42
* @param file txt文件
* @return
* @throws Exception
*/
public static List<DataRecord> resolveTxt(File file) throws Exception{
List<DataRecord> result = new ArrayList<DataRecord>();
if(file.exists()){
FileInputStream fin = new FileInputStream(file);
InputStreamReader in = new InputStreamReader(fin);
BufferedReader br = new BufferedReader(in);
try {
String line;
int index = 0;
DataRecord temp = null;
while ((line = br.readLine()) != null) {
if(line.trim().equals("")){
index++;
continue;
}
/* if(index == 0){
index++;
continue;
}
*/
String[] arr = line.split("\\s+");
temp = new DataRecord();
temp.put("TASK_ID", arr[0]);
temp.put("POINT_ID", arr[1]);
temp.put("TIME", arr[2]);
if(arr.length > 3){
if(arr[3].indexOf(',') != -1){
String[] actions = arr[3].split(",");
for (String string : actions) {
if(string.indexOf('$') != -1){
string = string.substring(0, string.indexOf("$"));
}
temp.put("POINT_ACTION_CODE", string);
result.add(temp);
}
}else{
if(arr[3].indexOf('$') != -1){
arr[3] = arr[3].substring(0, arr[3].indexOf("$"));
}
temp.put("POINT_ACTION_CODE", arr[3]);
result.add(temp);
}
}else{
result.add(temp);
}
index++;
}
} catch (Exception e) {
// TODO: handle exception
} finally {
br.close();
in.close();
fin.close();
}
}
return result;
}
/**
*
* @function 获取文件的创建时间.
* @author Liangjw
* @date 2019-5-27 下午01:40:34
* @param file 文件
* @return
*/
public static Date getFileCreateTime(File file){
Path path = Paths.get(file.getAbsolutePath());
BasicFileAttributeView basicview = Files.getFileAttributeView(path, BasicFileAttributeView.class,
LinkOption.NOFOLLOW_LINKS);
BasicFileAttributes attr;
try {
attr = basicview.readAttributes();
return new Date(attr.creationTime().toMillis());
} catch (Exception e) {
return null;
}
}
/**
*
* @function 判断文件格式是否符合要求.
* 符合要求格式有:JPG、PNG、AVI、MOV、RMVB、FLV、MP4、MP3
* @author Liangjw
* @date 2019-7-9 上午11:44:34
* @param fileName 文件名
* @return
*/
public static boolean ifFileFormat(String fileName){
if(fileName.indexOf(".JPG") != -1 || fileName.indexOf(".jpg") != -1 ||
fileName.indexOf(".PNG") != -1 || fileName.indexOf(".png") != -1 ||
fileName.indexOf(".AVI") != -1 || fileName.indexOf(".avi") != -1 ||
fileName.indexOf(".MOV") != -1 || fileName.indexOf(".mov") != -1 ||
fileName.indexOf(".RMVB") != -1 || fileName.indexOf(".rmvb") != -1 ||
fileName.indexOf(".FLV") != -1 || fileName.indexOf(".flv") != -1 ||
fileName.indexOf(".MP4") != -1 || fileName.indexOf(".mp4") != -1 ||
fileName.indexOf(".MP3") != -1 || fileName.indexOf(".mp3") != -1){
return true;
}
return false;
}
/**
*
* @function 判断文件是否为图片.
* @author Liangjw
* @date 2019-7-11 下午02:57:06
* @param fileName 文件名
* @return
*/
public static boolean ifFileAsImg(String fileName){
if(fileName.indexOf(".JPG") != -1 || fileName.indexOf(".jpg") != -1 ||
fileName.indexOf(".PNG") != -1 || fileName.indexOf(".png") != -1){
return true;
}
return false;
}
}
package com.shd.biz.dataManagement.util;
import java.io.File;
/**
*
* @function 压缩工具类
* @author Liangjw
* @date 2019-5-15 上午11:01:30
* @version
* @since JDK 1.7
*/
public class ZipUtils {
private static final int BUFFER_SIZE = 2 * 1024;
public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure)throws RuntimeException{
long start = System.currentTimeMillis();
ZipOutputStream zos = null ;
try {
zos = new ZipOutputStream(out);
zos.setEncoding("gbk");
File sourceFile = new File(srcDir);
compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure);
long end = System.currentTimeMillis();
System.out.println("压缩完成,耗时:" + (end - start) +" ms");
} catch (Exception e) {
throw new RuntimeException("zip error from ZipUtils",e);
}finally{
if(zos != null){
try {
zos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 压缩成ZIP 方法2
* @param srcFiles 需要压缩的文件列表
* @param out 压缩文件输出流
* @throws RuntimeException 压缩失败会抛出运行时异常
*/
public static void toZip(List<File> srcFiles , OutputStream out)throws RuntimeException {
long start = System.currentTimeMillis();
ZipOutputStream zos = null ;
try {
zos = new ZipOutputStream(out);
for (File srcFile : srcFiles) {
byte[] buf = new byte[BUFFER_SIZE];
zos.putNextEntry(new ZipEntry(srcFile.getName()));
int len;
FileInputStream in = new FileInputStream(srcFile);
while ((len = in.read(buf)) != -1){
zos.write(buf, 0, len);
}
zos.closeEntry();
in.close();
}
long end = System.currentTimeMillis();
System.out.println("压缩完成,耗时:" + (end - start) +" ms");
} catch (Exception e) {
throw new RuntimeException("zip error from ZipUtils",e);
}finally{
if(zos != null){
try {
zos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 递归压缩方法
* @param sourceFile 源文件
* @param zos zip输出流
* @param name 压缩后的名称
* @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构;
* false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
* @throws Exception
*/
private static void compress(File sourceFile, ZipOutputStream zos, String name,
boolean KeepDirStructure) throws Exception{
byte[] buf = new byte[BUFFER_SIZE];
if(sourceFile.isFile()){
// 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字
zos.putNextEntry(new ZipEntry(name));
//zos.putNextEntry(new ZipEntry(name));
System.out.println(name);
// copy文件到zip输出流中
int len;
FileInputStream in = new FileInputStream(sourceFile);
//BufferedReader in=new BufferedReader(new InputStreamReader(fileInputStream,"GBK"));
while ((len = in.read(buf)) != -1){
zos.write(buf, 0, len);
}
// Complete the entry
zos.closeEntry();
in.close();
} else {
File[] listFiles = sourceFile.listFiles();
if(listFiles == null || listFiles.length == 0){
// 需要保留原来的文件结构时,需要对空文件夹进行处理
if(KeepDirStructure){
// 空文件夹的处理
zos.putNextEntry(new ZipEntry(name + "/"));
// 没有文件,不需要文件的copy
zos.closeEntry();
}
}else {
for (File file : listFiles) {
// 判断是否需要保留原来的文件结构
if (KeepDirStructure) {
// 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,
// 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了
compress(file, zos, name + "/" + file.getName(),KeepDirStructure);
} else {
compress(file, zos, file.getName(),KeepDirStructure);
}
}
}
}
}
}