import java.io.File; import java.io.IOException; import java.nio.file.FileVisitResult; import java.nio.file.FileVisitor; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.attribute.BasicFileAttributes; import java.time.Duration; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Set; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * @author reghao * @date 2025-12-18 13:43:47 */ public class RtmpFileCleaner { static ScheduledExecutorService scheduler = new ScheduledThreadPoolExecutor(1); static Set set = Set.of("22", "23", "00", "01", "02", "03", "04", "05", "06", "07"); static void test() { LocalDateTime now = LocalDateTime.now(); String filename = "cam204-1765896327_20251216_224527.flv"; String[] strArr = filename.replace(".flv", "").split("_"); String date = strArr[1]; String time = strArr[2]; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd HHmmss"); LocalDateTime localDateTime = LocalDateTime.parse(date + " " + time, formatter); String hour = time.substring(0, 2); if (set.contains(hour)) { } Duration duration = Duration.between(localDateTime, now); long result = duration.getSeconds() - 3600L*12; System.out.println(result); } public static void main(String[] args) { String baseDir = "/opt/data/ngxflv/rtmp"; scheduler.scheduleAtFixedRate(new CleanerTask(baseDir), 0, 8, TimeUnit.HOURS); } static class CleanerTask implements Runnable { private final String baseDir; private LocalDateTime now; public CleanerTask(String baseDir) { this.baseDir = baseDir; } @Override public void run() { now = LocalDateTime.now(); try { walkDir(Path.of(baseDir)); } catch (IOException e) { e.printStackTrace(); } System.out.printf("%s RtmpFileCleaner task completed.\n", now); } private void walkDir(Path path) throws IOException { Files.walkFileTree(path, new FileVisitor() { @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { try { process(file.toFile()); } catch (Exception e) { e.printStackTrace(); } return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { return FileVisitResult.CONTINUE; } }); } private void process(File file) { String filename = file.getName(); String[] strArr = filename.replace(".flv", "").split("_"); String date = strArr[1]; String time = strArr[2]; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd HHmmss"); LocalDateTime localDateTime = LocalDateTime.parse(date + " " + time, formatter); LocalDateTime current = LocalDateTime.now(); String hour = time.substring(0, 2); if (set.contains(hour)) { if (file.delete()) { System.out.printf("%s Deleting file %s\n", current, file.getAbsolutePath()); } else { System.out.printf("%s Deleting file %s failed\n", current, file.getAbsolutePath()); } return; } Duration duration = Duration.between(localDateTime, now); long result = duration.getSeconds() - 3600L*24; if (result > 0) { if (file.delete()) { System.out.printf("%s Deleting file %s\n", current, file.getAbsolutePath()); } else { System.out.printf("%s Deleting file %s failed\n", current, file.getAbsolutePath()); } } } } }