java实现每一个小时创建一个文件夹

本文介绍了一种使用Java实现每小时生成一个日志文件夹,并在每个文件夹内生成一个文件的方法,通过设置时间间隔来优化日志分析流程。

在开发的过程中如果一个项目的访问量很大的时候我们可能需要对项目的日志做一个分析,从而会产生一个需求那就可能是需要把日志按小时来分类存储(也就是日志每一个小时产生一个文件夹并每一小时产生一个文件这样的话有利于日后的日志分析工作),但是这样的实现并不困难方法很多,可是直接使用java.util.TimeTask来实现,只要设置period的时间段为自己想设置的时间段就可以,但同时也可以直接用quartz定时程序来实现。我这边只是写了一个测试程序来实现该功能,使用的Thread来实现.(以下代码仅供参考)
public class Test implements Runnable {

private static String parentDirectory = "E:\\web"; // 根目录
private static long et; // 时间间隔时间
private static String filePath; // 文件路径
private static int count = 0; // 记数器

public static void main(String[] args){
new Thread(new Test()).start();
}

private static void init(){
// init directory and fileName
parentDirectory = "E:\\web";
filePath = null;

Calendar cInstance = new GregorianCalendar();
// 时间间隔在此设置,我设置为每一分钟创建一个文件夹
cInstance.add(Calendar.MINUTE, (+1));
et = cInstance.getTimeInMillis() >>> 10;
++ count;
createDirectory(String.valueOf(count));
createNewFile(String.valueOf(count));
}

public void run(){
for(;;){
if(count == 0)
init();

// write to disk
fileWriteToDisk();

// if start > end ,init time
if(timeInseconds() > et){
init();
}
}
}

private static void createDirectory(String dirName){
parentDirectory = parentDirectory + File.separator + dirName;
System.out.println("directory----->" + parentDirectory);
File directory = new File(parentDirectory);
if(!directory.exists())
directory.mkdirs();
}


private static long timeInseconds(){
return System.currentTimeMillis() >>> 10;
}

private static void createNewFile(String fileName){
filePath = parentDirectory + File.separator + fileName + ".properties";
System.out.println("newFileName----------->" + filePath);
File file = new File(filePath);
if(!file.exists()){
try{
file.createNewFile();
}catch(IOException ex){
;
}
}
}

private static void fileWriteToDisk(){
File path = new File(filePath);
if(path.exists()){
try{
BufferedWriter bout = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path,true)));
bout.write(String.valueOf(count));
bout.newLine();
bout.flush();
}catch(FileNotFoundException fn){
System.out.println("fileNotFound-->" + fn.getMessage());
}catch(IOException ex){
;
}
}
}
}
<think> 我们需要解决两个问题: 1. 根据当前时间生成文件夹(格式为YYYY-MM) 2. 删除昨天创建文件夹(注意:昨天创建文件夹可能是以昨天的年月命名的,但具体格式要一致) 假设我们每天创建文件夹格式为"yyyy-MM-dd",那么: - 今天的文件夹:使用当前日期生成,格式如"2024-06-25" - 昨天的文件夹:格式为昨天的日期,如"2024-06-24" 但根据引用[2]中的例子,他们使用了年月(YYYY-MM)作为文件夹。所以我们需要明确: - 用户需求是生成以年月为单位的文件夹,还是以具体日期(年月日)为单位的文件夹? 根据用户问题:“根据当前时间生成文件夹,并删除昨天创建文件夹”,这里有两种可能: a) 生成以当前年月(YYYY-MM)命名的文件夹,删除昨天对应年月的文件夹(注意:昨天可能还在同一个月,也可能跨月)。 b) 生成以当前日期(YYYY-MM-DD)命名的文件夹,删除昨天的日期文件夹。 由于引用[2]中使用了年月,但用户这次要求删除“昨天”的文件夹,显然按天创建更符合删除昨天的逻辑。因为如果是按月创建,那么同一个月的文件夹只有1个,删除昨天的文件夹没有意义(因为昨天和今天在同一个文件夹里)。 因此,我推断用户需要的是按天创建文件夹,即格式为yyyy-MM-dd。那么: 步骤1:生成今天的文件夹(格式:yyyy-MM-dd) 步骤2:查找并删除昨天的文件夹(格式:使用昨天的日期,同样为yyyy-MM-dd) 注意:删除文件夹时,要确保该文件夹为空?或者我们可能需要递归删除非空文件夹? 下面给出代码实现: 1. 获取当前日期和昨天的日期(使用Java 8的日期API) 2. 构建文件夹路径(假设基础路径为某个父目录) 3. 创建今天的文件夹(如果不存在) 4. 删除昨天的文件夹(如果存在) 代码示例: ```java import java.io.IOException; import java.nio.file.*; import java.time.LocalDate; public class FolderManager { public static void main(String[] args) { // 基础父目录 String basePath = "path/to/parent/folder/"; // 1. 获取今天的日期并创建文件夹 LocalDate today = LocalDate.now(); Path todayFolder = Paths.get(basePath, today.toString()); // 格式:yyyy-MM-dd createFolder(todayFolder); // 2. 获取昨天的日期并删除对应文件夹 LocalDate yesterday = today.minusDays(1); Path yesterdayFolder = Paths.get(basePath, yesterday.toString()); deleteFolder(yesterdayFolder); } private static void createFolder(Path path) { try { if (!Files.exists(path)) { Files.createDirectories(path); System.out.println("创建文件夹: " + path); } else { System.out.println("文件夹已存在: " + path); } } catch (IOException e) { System.err.println("创建文件夹失败: " + e.getMessage()); } } private static void deleteFolder(Path path) { try { if (Files.exists(path)) { // 递归删除目录及内容 Files.walkFileTree(path, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { Files.delete(file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { Files.delete(dir); return FileVisitResult.CONTINUE; } }); System.out.println("删除文件夹: " + path); } else { System.out.println("文件夹不存在,无需删除: " + path); } } catch (IOException e) { System.err.println("删除文件夹失败: " + e.getMessage()); } } } ``` 注意: - 使用`Files.createDirectories`可以创建多级目录。 - 删除文件夹使用递归删除,因为Java的`Files.delete`只能删除空目录。 如果用户确实希望按月创建(如引用[2]),那么删除昨天的文件夹就不合理了。因为同一个月的文件夹每天都会使用,不能删除。所以这里我们假设用户是按天创建。 但如果用户的需求是按月创建,那么删除昨天的文件夹应该改成删除上个月的文件夹?用户的问题描述是“删除昨天创建文件夹”,所以按天更合理。 因此,我们按照按天创建实现。 另外,用户可能需要自定义父目录路径,可以通过参数传入或配置文件读取,这里为了示例,我们写死了`basePath`。 相关问题: 1. 如何按小时创建文件夹并定期清理? 2. 如何防止误删除重要的文件夹? 3. 使用Java删除非空文件夹有哪些方法? </think> 以下是如何使用Java根据当前时间生成文件夹并删除昨天创建文件夹的完整解决方案,结合引用内容进行优化: ### 1. 根据当前时间生成文件夹 ```java import java.io.File; import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class FolderManager { // 基础目录路径(根据需求修改) private static final String BASE_PATH = "path/to/parent/folder/"; public static void createTodayFolder() { // 获取当前日期格式化为yyyy-MM-dd String folderName = LocalDate.now().format(DateTimeFormatter.ISO_DATE); File folder = new File(BASE_PATH + folderName); // 使用mkdirs()创建多级目录[^3] if (!folder.exists()) { if (folder.mkdirs()) { System.out.println("今日文件夹创建成功: " + folder.getAbsolutePath()); } else { System.err.println("文件夹创建失败: " + folder.getAbsolutePath()); } } else { System.out.println("文件夹已存在: " + folder.getAbsolutePath()); } } } ``` ### 2. 删除昨天创建文件夹 ```java import java.io.IOException; import java.nio.file.*; public class FolderManager { // ... 接上文代码 public static void deleteYesterdayFolder() { // 获取昨天日期 String yesterday = LocalDate.now().minusDays(1).format(DateTimeFormatter.ISO_DATE); Path folderPath = Paths.get(BASE_PATH + yesterday); try { // 递归删除目录及内容[^3] if (Files.exists(folderPath)) { Files.walk(folderPath) .sorted(java.util.Comparator.reverseOrder()) .forEach(path -> { try { Files.delete(path); } catch (IOException e) { System.err.println("删除失败: " + path); } }); System.out.println("昨日文件夹已删除: " + folderPath); } else { System.out.println("昨日文件夹不存在: " + folderPath); } } catch (IOException e) { System.err.println("删除异常: " + e.getMessage()); } } public static void main(String[] args) { createTodayFolder(); // 创建今日文件夹 deleteYesterdayFolder(); // 删除昨日文件夹 } } ``` ### 关键实现说明: 1. **日期处理** - 使用`LocalDate`获取精确时间,避免时区问题 - `DateTimeFormatter.ISO_DATE`生成`yyyy-MM-dd`格式 - `minusDays(1)`安全计算昨天日期 2. **目录操作优化** - `mkdirs()`创建多级目录(引用内容[^3]) - 递归删除使用`Files.walk().sorted(reverseOrder())`确保从内向外删除 - 先检查路径存在性避免空指针(引用内容[^3]) 3. **错误处理** - 捕获IO异常并输出错误日志 - 验证操作结果状态 ### 执行结果示例: ``` 今日文件夹创建成功: path/to/parent/folder/2024-06-25 昨日文件夹已删除: path/to/parent/folder/2024-06-24 ``` ### 相关注意事项: 1. **权限问题**:确保程序对目标目录有读写权限 2. **路径格式**:Windows系统路径需使用`\\`或`/` 3. **安全删除**:重要数据建议先移入回收站而非直接删除 4. **定时任务**:可通过`ScheduledExecutorService`实现每日自动执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值