目录
- 1 文件拷贝,强制覆盖目标文件
- 2 复制文件夹
- 3 创建父目录路径和子目录路径
- 4 把多个文件夹打成.tar.gz包(从当前的目录开始)
- 5 判断字符串是不是以数字开头
- 6 判断文件是否有后缀
- 7 获取当前项目所在的路径
- 8 从TXT文件读取东西
- 9 从文件夹里面查询文件
- 10 根据时间分类,创建文件夹
- 11 读取当前时间前三天的数据,进行删除
- 12 获取文件名的后缀
- 13 获取文件的修改时间
- 14 判断字符串是不是都是数字
- 15 根据file递归删除文件夹下的全部数据
- 16 递归读取文件路径下的 没有后缀的 所有文件
- 17 往文件里面写内容
- 18 根据文件路径,读取文件内容
- 19 定时迁移数据到时间文件夹下
1 文件拷贝,强制覆盖目标文件
//文件拷贝,强制覆盖目标文件
public static void copyFileForce(File file, File fileTo){
try {
Files.copy(file.toPath(),fileTo.toPath(), StandardCopyOption.REPLACE_EXISTING.REPLACE_EXISTING);
} catch (IOException e) {
e.printStackTrace();
}
}
2 复制文件夹
复制文件夹
将源文件的外层目录也拷贝入新目录下
/**
*
* <p>Method :copyDirectory
* <p>Description : 复制文件夹
* 将源文件的外层目录也拷贝入新目录下
* @param sourcePathString
* @param targetPathString
*/
public static void copyDirectory(String sourcePathString,String targetPathString){
if(!new File(sourcePathString).canRead()){
System.out.println("源文件夹" + sourcePathString + "不可读,无法复制!");
}else{
// yin 本地测试,上传记得更改为一个斜杠
String endDir = sourcePathString.split(File.separator)[sourcePathString.split(File.separator).length-1];
//将源文件的外层目录也拷贝入新目录下
targetPathString = targetPathString+File.separator+endDir;
(new File(targetPathString)).mkdirs();
System.out.println("开始复制文件夹" + sourcePathString + "到" + targetPathString);
File[] files = new File(sourcePathString).listFiles();
for (File file : files) {
if (file.isFile()) {
copyFileForce(new File(sourcePathString + File.separator + file.getName()), new File(targetPathString + File.separator + file.getName()));
} else if (file.isDirectory()) {
copyDirectory(sourcePathString + File.separator + file.getName(), targetPathString);
}
}
System.out.println("复制文件夹" + sourcePathString + "到" + targetPathString + "结束");
}
}
3 创建父目录路径和子目录路径
给一个父路径,一个子路径,如果不存在就创建
/**
* 构建目录
* @param outputDir
* @param subDir
*/
private 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();
}
}
4 把多个文件夹打成.tar.gz包(从当前的目录开始)
/**
* 把多个文件夹打成.tar.gz包(从当前的目录开始)
* @param sourceFolder 需要打成.tar.gz包的目录列表(包含目录和目录下的所有文件和文件夹)
* @param tarGzPath 打成的tar包生成的目标目录 例: D:/tmp 最终打包会在 D:/tmp目录下生成 test.tar.gz包
* @param tarGzFileName 打tar.gz包的名,例如:ide-sdk.tar.gz
*/
public static void fileListToTar(List<String> sourceFolder, String tarGzPath, String tarGzFileName) {
TarArchiveOutputStream tarOs = null;
try {
for(String folder : sourceFolder){
File sourceFile = new File(folder);
if (!sourceFile.exists()) {
throw new FileNotFoundException("压缩的目录不存在。。。");
}
}
tarOs = createTar(tarGzPath,tarGzFileName,tarOs);
for(String folder : sourceFolder){
addFileListToTarGZ(folder, tarOs);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
tarOs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 把文件复制到.tar.gz包中
* @param sourceFile 需要复制的文件路径
* @param tarArchive tar包流
* @throws IOException 异常
*/
private static void addFileListToTarGZ(String sourceFile, TarArchiveOutputStream tarArchive)
throws IOException {
File file = new File(sourceFile);
String parent = sourceFile.split(File.separator)[sourceFile.split(File.separator).length-2];
String entryName = parent +File.separator+ file.getName();
// 添加 tar ArchiveEntry
tarArchive.putArchiveEntry(new TarArchiveEntry(file, entryName));
if (file.isFile()) {
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
// 写入文件
IOUtils.copy(bis, tarArchive);
tarArchive.closeArchiveEntry();
bis.close();
}
}
/**
* 创建tar包的流
* @param tarGzPath 需要复制的文件路径
* @param tarGzFileName 文件名称
* @param tarOs tar包流
* @throws IOException 异常
*/
private static TarArchiveOutputStream createTar(String tarGzPath, String tarGzFileName,TarArchiveOutputStream tarOs) throws IOException {
File tarGzFile = new File(tarGzPath);
if (!tarGzFile.exists()) {
tarGzFile.mkdirs();
}
// 创建一个 FileOutputStream 到输出文件(.tar.gz)
File tarFile = new File(tarGzFile + "/" + tarGzFileName);
FileOutputStream fos = new FileOutputStream(tarFile);
// 创建一个 GZIPOutputStream,用来包装 FileOutputStream 对象
GZIPOutputStream gos = new GZIPOutputStream(new BufferedOutputStream(fos));
// 创建一个 TarArchiveOutputStream,用来包装 GZIPOutputStream 对象
tarOs = new TarArchiveOutputStream(gos);
// 若不设置此模式,当文件名超过 100 个字节时会抛出异常,异常大致如下:
// is too long ( > 100 bytes)
// 具体可参考官方文档:http://commons.apache.org/proper/commons-compress/tar.html#Long_File_Names
tarOs.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX);
return tarOs;
}
5 判断字符串是不是以数字开头
/**
* @Description: 判断字符串是不是以数字开头
*/
public static boolean isStartWithNumber(String str) {
Pattern pattern = Pattern.compile("[0-9]*");
Matcher isNum = pattern.matcher(str.charAt(0)+"");
if (!isNum.matches()) {
return false;
}
return true;
}
6 判断文件是否有后缀
/**
* @Description: 判断文件是否有后缀
*/
public static boolean verificationFile(String originFileName){
// 后缀
int num = originFileName.lastIndexOf(".");
if(num == -1) {
return true;
}
return false;
}
7 获取当前项目所在的路径
File file1 = new File(System.getProperty("user.dir"));
8 从TXT文件读取东西
File file1 = new File(System.getProperty("user.dir"));
File file = new File(file1.getPath() + str + "demo.txt");
BufferedReader reader = null;
String tempString = null;
int line =1;
try {
// System.out.println("以行为单位读取文件内容,一次读一整行:");
reader = new BufferedReader(new FileReader(file));
while ((tempString = reader.readLine()) != null) {
// 读取第一行
if(1 == line){
source = tempString;
// 读取第二行
}else if (2 == line){
desc = tempString;
}else {
okfile = tempString;
}
line ++ ;
}
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally{
if(reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
9 从文件夹里面查询文件
path 原路径文件夹里面有很多的数据,想拿出来做一些处理,对于已经处理过的,将在另一个文件夹里面保存为后缀为ok;
只要一个文件创建过ok文件,就是处理过的,下一次遍历拿数据,就不把他拿出来了;
// 存放过滤出来的 文件
ArrayList<String> paths1 = new ArrayList<>();
/**
* 递归读取文件路径下的 没有后缀的 所有文件
* 根据当前的时间 G:\demo\2022\202208\20220802
* @param path 原路径
* @param fileNameList 存放过滤出来的文件
* @param okpath .ok路径
*/
public static ArrayList<String> readFiles(String path, ArrayList<String> fileNameList,String okpath) {
// String newPathInfo = newPath(path);
String str = File.separator;
File file = new File(path);
if (file.isDirectory()) {
// 当前是文件夹
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
// 判断是否是文件夹,如果是文件夹,递归读取
readFiles(files[i].getPath(), fileNameList,okpath);
}
else {
String path1 = files[i].getName(); // 获取当前文件的名称
if(path1.startsWith("W_NAFP_C_ECMF") && verificationFile(path1)){
if(!new File(okpath+str+path1+".ok").exists()){
// ok文件不存在
fileNameList.add(files[i].getPath());
}
}
}
}
}
else {
String path1 = file.getName();
if(path1.startsWith("W_NAFP_C_ECMF") && verificationFile(path1)){
if(!new File(okpath+str+path1+".ok").exists()){
// ok文件不存在
fileNameList.add(path1);
}
}
}
return fileNameList;
}
/**
* @Description: 判断文件是否有后缀
*/
public static boolean verificationFile(String originFileName){
// 后缀
int num = originFileName.lastIndexOf(".");
if(num == -1) {
return true;
}
return false;
}
10 根据时间分类,创建文件夹
在一个文件夹下,想定时生成每天的数据,将数据以天分开,也就是时间文件夹名称隔开;比如在
H:\www\
这个文件夹下,生成时间名称 20220801文件夹 20220802文件夹
H:\www\20220801
H:\www\20220802
以上的这种格式
// 创建当前起报时间 的文件夹,
// 获取到当前的时间
String qbtime = DateUtils.dateToString(obsTime, DateUtils.dateType1);
File qbfile1 = new File(descfile.getPath(),qbtime);
if(!qbfile1.exists()){
try {
qbfile1.mkdir();
} catch (Exception e) {
e.printStackTrace();
log.info(">>>>>>>>> 创建.ok文件失败");
}
}
11 读取当前时间前三天的数据,进行删除
H:\www\20220801
H:\www\20220802
以以上的这种格式,进行文件夹的删除,具体逻辑:
// 先获取当前日期前三天的时间
String qsantian = DateUtils.Qsantian();// 前3天时间
Date date2 = DateUtils.stringToDate(qsantian, DateUtils.DATE_FORMAT_YYYY_MM_DD);
List<String> newfilesinfo = new ArrayList<>();// 存放过期的文件夹
List<String> filesinfo = new ArrayList<>();// 存放文件夹的名称
// 遍历路径,获取当前路径下的文件夹名称
File descfile = new File(desc);
File[] files = descfile.listFiles();
for(File item: files){
if(item.isDirectory()){
if(item.getName().length()==10){
// System.out.println(item.getName());
filesinfo.add(item.getName());
}
}
}
for(String item:filesinfo){
// 获取到每一个文件夹的名称
Date date = DateUtils.stringToDate(item, DateUtils.dateType1);
Date date1 = DateUtils.dateFormat(date, DateUtils.DATE_FORMAT_YYYY_MM_DD);
// String s = DateUtils.dateToString(date1, DateUtils.DATE_FORMAT_YYYY_MM_DD);
// System.out.println(s);
if(date1.before(date2)){
newfilesinfo.add(item);
}
}
// System.out.println(newfilesinfo.size());
for(String item:newfilesinfo){
for(File items: files) {
if (items.isDirectory()) {
if (items.getName().length() == 10) {
if(items.getName().startsWith(item)){
// File file2 = new File(file.getPath(), items.getName());
FileInfoUtils.remove(items);
}
}
}
}
}
}
12 获取文件名的后缀
//使用lastIndexOf()结合subString()获取后缀名
public String lastName(File file){
if(file==null) return null;
String filename = file.getName();
if(filename.lastIndexOf(".")==-1){
return "";//文件没有后缀名的情况
}
//此时返回的是带有 . 的后缀名,
return filename.subString(filename.lastIndexOf("."));
//return filename.subString(filename.lastIndexOf(".")+1);// 这种返回的是没有.的后缀名
// 下面这种如果对于String类型可能有问题,如 以.结尾的字符串,会报错。但是文件没有以点结尾的
}
// split截取后缀名
public String lastName(File file) {
if (file == null) return null;
String filename = file.getName();
// split用的是正则,所以需要用 //. 来做分隔符
String[] split = filename.split("\\.");
//注意判断截取后的数组长度,数组最后一个元素是后缀名
if (split.length > 1) {
return split[split.length - 1];
} else {
return "";
}
}
13 获取文件的修改时间
File file = new File("H:\\Config.py");
Long lastModified = file.lastModified();
Date date = new Date(lastModified);
System.out.println(DateUtils.dateToString(date,DateUtils.dateType7));
14 判断字符串是不是都是数字
/**
* @Description: 判断字符串是不是都是数字
*/
public static boolean StrisNumber(String str) {
Pattern pattern = Pattern.compile("[0-9]*");
Matcher isNum = pattern.matcher(str);
if (!isNum.matches()) {
return false;
}
return true;
}
15 根据file递归删除文件夹下的全部数据
/**
* 删除指定文件夹下的全部内容
* @param file
*/
public static void remove(File file) {
File[] files = file.listFiles();//将file子目录及子文件放进文件数组
if (files != null) {//如果包含文件进行删除操作
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {//删除子文件
files[i].delete();
} else if (files[i].isDirectory()) {//通过递归方法删除子目录的文件
remove(files[i]);
}
files[i].delete();//删除子目录
}
}
file.delete();
}
/**
* delete recursively 递归删除
* @param root 文件路径
* @return
*/
public static boolean deleteRecursively(File root) {
if (root != null && root.exists()) {
// 如果传进来的路径存在
if (root.isDirectory()) {
// 如果是文件夹
File[] children = root.listFiles();
if (children != null) {
for (File child : children) {
// 递归
deleteRecursively(child);
}
}
}
// 如果是文件 就删除
return root.delete();
}
return false;
}
16 递归读取文件路径下的 没有后缀的 所有文件
/**
* 递归读取文件路径下的 没有后缀的 所有文件
* 根据当前的时间 G:\demo\2022\202208\20220802
* @param path 原路径
* @param fileNameList 存放过滤出来的文件
* @param okpath .ok路径
*/
public static ArrayList<String> readFiles(String path, ArrayList<String> fileNameList,String okpath) {
// String newPathInfo = newPath(path);
String str = File.separator;
File file = new File(path);
if (file.isDirectory()) {
// 当前是文件夹
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
// 判断是否是文件夹,如果是文件夹,递归读取
readFiles(files[i].getPath(), fileNameList,okpath);
}
else {
String path1 = files[i].getName(); // 获取当前文件的名称
if(path1.startsWith("W_NAFP_C_ECMF") && verificationFile(path1)){
if(!new File(okpath+str+path1+".ok").exists()){
// ok文件不存在
fileNameList.add(files[i].getPath());
}
}
}
}
}
else {
String path1 = file.getName();
if(path1.startsWith("W_NAFP_C_ECMF") && verificationFile(path1)){
if(!new File(okpath+str+path1+".ok").exists()){
// ok文件不存在
fileNameList.add(path1);
}
}
}
return fileNameList;
}
17 往文件里面写内容
/**
* 往文件里面写内容
* @param file 单个文件
* @return
*/
public static void writeFileContent(File file, byte[] data) {
// file
if (!file.exists()) {
file.getParentFile().mkdirs();
}
// append file content 追加文件内容
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
fos.write(data);
fos.flush();
} catch (Exception e) {
logger.error(e.getMessage(), e);
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
}
}
18 根据文件路径,读取文件内容
/**
* 根据文件路径,读取文件内容
* @param file 单个文件
* @return
*/
public static byte[] readFileContent(File file) {
Long filelength = file.length();
byte[] filecontent = new byte[filelength.intValue()];
FileInputStream in = null;
try {
in = new FileInputStream(file);
in.read(filecontent);
in.close();
return filecontent;
} catch (Exception e) {
logger.error(e.getMessage(), e);
return null;
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
}
}
19 定时迁移数据到时间文件夹下
/**
* 迁移路径下的数据到 时间文件夹下
* @param path
*/
public static void moveFilesToTodayFolder(String path) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
String todayFolderName = dateFormat.format(new Date());
File pathFile = new File(path);
File todayFolder = new File(pathFile, todayFolderName);
// 如果当天的文件夹不存在,则创建
if (!todayFolder.exists()) {
todayFolder.mkdir();
}
// 将 path 下的所有文件移动到当天的文件夹下
File[] files = pathFile.listFiles();
for (File file : files) {
if (file.isFile()) {
file.renameTo(new File(todayFolder, file.getName()));
}
}
}