package com.utils;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.CharArrayWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class FilesUtils {
/**
* 修改文件夹名称
*
* @param fname
* @param targetName
*/
@SuppressWarnings("unused")
public static boolean renameFile(String fname, String targetName) {
File file = new File(fname);
if (!(file == null)) {
File newFile = new File(targetName);
file.renameTo(newFile);
} else {
return false;
}
return true;
}
/**
* 复制文件
*
* @param srcFolder
* 源文件
* @param destFolder
* 目标文件
* @throws IOException
*/
public static boolean copyFolder(String srcFolder, String destFolder) throws IOException {
final Path srcPath = Paths.get(srcFolder);
// 这里多创建一级,就解决了没有外壳的问题
final Path destPath = Paths.get(destFolder, srcPath.toFile().getName());
// 检查源文件夹是否存在
if (Files.notExists(srcPath)) {
System.exit(1);
return false;
}
// 如果目标目录不存在,则创建
if (Files.notExists(Paths.get(destFolder))) {
Files.createDirectories(Paths.get(destFolder));
}
Files.walkFileTree(srcPath, new SimpleFileVisitor<Path>() {
@Override
// 文件处理,将文件夹也一并处理,简洁些
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Path dest = destPath.resolve(srcPath.relativize(file));
// 如果说父路径不存在,则创建
if (Files.notExists(dest.getParent())) {
Files.createDirectories(dest.getParent());
}
Files.copy(file, dest);
return FileVisitResult.CONTINUE;
}
});
return true;
}
/**
* 删除文件,可以是单个文件或文件夹
*
* @param fileName
* 待删除的文件名
* @return 文件删除成功返回true,否则返回false
*/
public static boolean delete(String fileName) {
File file = new File(fileName);
if (!file.exists()) {
return false;
} else {
if (file.isFile()) {
return deleteFile(fileName);
} else {
return deleteDirectory(fileName);
}
}
}
/**
* 删除单个文件
*
* @param fileName
* 被删除文件的文件名
* @return 单个文件删除成功返回true,否则返回false
*/
public static boolean deleteFile(String fileName) {
File file = new File(fileName);
if (file.isFile() && file.exists()) {
file.delete();
return true;
} else {
return false;
}
}
/**
* 删除目录(文件夹)以及目录下的文件
*
* @param dir
* 被删除目录的文件路径
* @return 目录删除成功返回true,否则返回false
*/
public static boolean deleteDirectory(String dir) {
// 如果dir不以文件分隔符结尾,自动添加文件分隔符
if (!dir.endsWith(File.separator)) {
dir = dir + File.separator;
}
File dirFile = new File(dir);
// 如果dir对应的文件不存在,或者不是一个目录,则退出
if (!dirFile.exists() || !dirFile.isDirectory()) {
return false;
}
boolean flag = true;
// 删除文件夹下的所有文件(包括子目录)
File[] files = dirFile.listFiles();
for (int i = 0; i < files.length; i++) {
// 删除子文件
if (files[i].isFile()) {
flag = deleteFile(files[i].getAbsolutePath());
if (!flag) {
break;
}
}
// 删除子目录
else {
flag = deleteDirectory(files[i].getAbsolutePath());
if (!flag) {
break;
}
}
}
if (!flag) {
return false;
}
// 删除当前目录
if (dirFile.delete()) {
return true;
} else {
return false;
}
}
/**
* 创建文件夹
*
* @param address
* @param folderName
*/
public static void createFolder(String address, String folderName) {
File file = new File(address);
if (!(file == null)) {
File newFile = new File(file.getPath() + "\\" + folderName);
if (newFile.mkdirs()) {
} else {
}
}
}
/**
* 替换文本文件中的符串
*
* @param path
* @throws IOException
*/
public static boolean replacTextContent(String path, String srcStr, String replaceStr) {
try {
// 读
File file = new File(path);
FileReader in = new FileReader(file);
BufferedReader bufIn = new BufferedReader(in);
// 内存流, 作为临时流
CharArrayWriter tempStream = new CharArrayWriter();
// 替换
String line = null;
while ((line = bufIn.readLine()) != null) {
// 替换每行中, 符合条件的字符串
line = line.replaceAll(srcStr, replaceStr);
// 将该行写入内存
tempStream.write(line);
// 添加换行符
tempStream.append(System.getProperty("line.separator"));
}
// 关闭 输入流
bufIn.close();
// 将内存中的流 写入 文件
FileWriter out = new FileWriter(file);
tempStream.writeTo(out);
in.close();
bufIn.close();
tempStream.close();
out.close();
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
return false;
} catch (IOException e) {
// TODO 自动生成的 catch 块
return false;
}
return true;
}
/**
* FilePath为文件路径
*
* @param FilePath
* @param str1
* 将str1替换为str1
* @param str2
* @return
*/
public static boolean changeTxtContent(String FilePath, String str1, String str2) {
try {
File file = new File(FilePath);
String code = getFileCharacterEnding(file);// 获取文件编码
InputStreamReader read = new InputStreamReader(new FileInputStream(file), code);
BufferedReader bufferedReader = new BufferedReader(read);
String TxtBuff = null;
StringBuffer out = new StringBuffer();
while ((TxtBuff = bufferedReader.readLine()) != null) {
TxtBuff = TxtBuff.replace(str1, str2);
out.append(TxtBuff);
out.append("\r\n");
}
read.close();
FileOutputStream outputstream = null;
outputstream = new FileOutputStream(file);
outputstream.write(out.toString().getBytes(code));
bufferedReader.close();
outputstream.close();
} catch (Exception e) {
// TODO 自动生成的 catch 块
return false;
}
return true;
}
public static String getFileCharacterEnding(File file) throws Exception {
InputStream inputStream = new FileInputStream(file);
byte[] head = new byte[3];
inputStream.read(head);
String code = "gbk";
if (head[0] == -1 && head[1] == -2) {
code = "UTF-16";
}
if (head[0] == -2 && head[1] == -1) {
code = "Unicode";
}
if (head[0] == -17 && head[1] == -69 && head[2] == -65) {
code = "UTF-8";
}
try {
inputStream.close();
} catch (Exception e) {
}
return code;
}
/**
*
* @return 获取文件配置参数
* @throws UnsupportedEncodingException
* @throws IOException
*/
public static Map<String, String> getProperties(String path) throws UnsupportedEncodingException, IOException {
Map<String, String> dataMess = new HashMap<>();
Properties properties = new Properties();
InputStream in = new BufferedInputStream(new FileInputStream(path + "sysconfig/MysqlDB.properties"));
properties.load(new InputStreamReader(in, "utf-8"));
dataMess.put("sF", properties.getProperty("srcFolder"));
dataMess.put("dF", properties.getProperty("destFolder"));
dataMess.put("uF", properties.getProperty("updateFolder"));
dataMess.put("sP", properties.getProperty("startPort"));
dataMess.put("eP", properties.getProperty("endPort"));
dataMess.put("cS", properties.getProperty("configSet"));
dataMess.put("wF", properties.getProperty("warFolder"));
return dataMess;
}
/**
* 查找文件路径
* @param searchName
* @param filePath
* @return
*/
public static String getRootWarFolder(String searchName,String filePath) {
String result = "";
File fileParent = new File(filePath);
File[] files = fileParent.listFiles();
for (File fileChild : files) {
if (fileChild.getName().equals(searchName)) {
result = fileChild.getAbsolutePath();
break;
}
}
return result;
}
/***
* 修复时间毫秒问题
* @param date
* @return
*/
@SuppressWarnings("deprecation")
public static Date getAppointDayOfEndTime(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
c.set(Calendar.SECOND, date.getSeconds());
c.set(Calendar.MILLISECOND, 0);
return c.getTime();
}
}