您的位置:首页 > 编程语言 > Java开发

java按文件夹下日志容量大小删除部分日志

2016-05-20 23:19 579 查看
【需求】最近正在研发一款应用,属于车载定位系统的应用,运行在安卓终端设备上,安卓版本低了点,为2.3.4。

每当运行此应用,就会生成一个形如Log2016-05-20.txt 这样的文本文件,用来保存设备运行的状态信息。

关于日志有两种管理方法,一种是按日期定时删除日志。服务器通过UDP下达命令可以设置日志保留的时长,比如服务器向安卓终端设置保存日志时长为7天。而设备已连续运行了8天,自然就生成过8个这样的文本文件,但保留时长设为7天之后,就要删除7天之前的日志,即这里指的就是最早的那篇了,大家都能明白吧。

另一种管理方法为按日志保存的容量删除日志。比如当前日志有3份,分别为:Log2016-05-11.txt  (日期最早,大小为5M), Log2016-05-12.txt (日期第二早,大小为6M), Log2016-0513.txt(最近日期,大小为2M) ,服务器设置日志容量大小为10MB,则每当应用初始化时,检查此文件夹下的这三个日志,前两个日志的和为:5+6=11 已经大于10M,则不计算后面的日志大小,就立即删除前两个日志,第三个日志得以保留。  如果日志大小分别为:5 ,6 , 12 ,9
。则按照需求,先删除5+6,再删除12,最后检查9<10. 最后一个得以保留。

所以,此需求就是这么变态。

于是在网上找了不少的方法与代码。自己也考虑了很多,结合网上的代码与自己的改写,有以下部分代码得以实现此功能(指的是第二种:按日志容量删除日志)

先看下工程结构:


然后直接贴代码:

Tes.java

package cn.lls;

import java.io.File;

import java.text.DateFormat;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Date;

import java.util.HashMap;

import java.util.List;

import cn.lls.utils.FileSort;

import cn.lls.utils.TypeConvertUtil;

public class Tes {

    static int dayInt;

    static long fileL;

    static int no = 0;

    static List<Long> list2;

    static long totalSize = 0;

    // 递归方法

    public static void deepList(File file) {

        if (file.isFile() || (0 == file.list().length)) {

            return;

        } else {

            File[] files = file.listFiles();

            files = FileSort.sort(files);

            for (File f : files) {

                if (f.isFile()) {

                    String fileName = f.getName();

                    if (!fileName.equals("Log" + ".txt")) {

                        String fileDay = fileName.substring(3, 13);

                        System.out.println(fileDay);

                        Date d = new Date();

                        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

                        dayInt = (int) TypeConvertUtil.getIntervalDays(fileDay, df.format(d));

                        System.out.print("离今天有:" + dayInt + " 天了   ");

                        fileL = f.length();

                        list2 = new ArrayList<>();

                        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();

                        map.put(dayInt, no);

                        list2.add(map.get(dayInt), fileL);

                        for (int i = 0; i < list2.size(); i++) {

                            totalSize += list2.get(i);

                            System.out.println("总大小:" + totalSize + " Bytes " + (totalSize / 1024 / 1024) + " MB");

                            if (totalSize > 12312) {

                                f.delete();

                            }

                        }

                    }

                }

            }

        }

    }

    public static void main(String[] args) {

        File f = new File("D:/aaa");

        deepList(f);

    }

}

FileSort.java

package cn.lls.utils;

import java.io.File;

import java.util.ArrayList;

import java.util.Collections;

import java.util.Comparator;

public class FileSort {

    /**

     * 将文件数组排序,目录放在上面,文件在下面 。最主要的目的是将文件倒序

     *

     * @param file

     * @return

     */

    public static File[] sort(File[] file) {

        ArrayList<File> list = new ArrayList<File>();

        for (File f : file) {

            if (f.isDirectory()) {

                list.add(f);

            }

        }

        for (File f : file) {

            if (f.isFile()) {

                list.add(f);

            }

        }

        // 将文件倒序

        Collections.sort(list, new Comparator<File>() {

            @Override

            public int compare(File o1, File o2) {

                if (o1.isDirectory() && o2.isFile())

                    return -1;

                if (o1.isFile() && o2.isDirectory())

                    return 1;

                return o2.getName().compareTo(o1.getName());

            }

        });

        return list.toArray(new File[file.length]);

    }

}

运行效果:

刚开始时模拟日志都保存到了一个目录下:(模拟时请删除此文件夹下的aaa.7z这个文件,否则会出错,我这个图里忘删除了)



然后 Ctrl + F11 运行此java程序:



可以看到程序里规定日志容量大小设定为12312 bytes。

所以从离现在最远的日期开始查找文件大小的和,如果和大于此设定值,则删除这几个文件。

目的达到了。花费了好多的时间去尝试。

源代码地址:

http://download.csdn.net/detail/yukimineryuu/9526677
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息