package com.tinyscreen.quteWatcher.Data; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.zip.Deflater; import java.util.zip.ZipOutputStream; import com.tinyscreen.quteWatcher.log.InfoObj; import com.tinyscreen.quteWatcher.log.Util; public class FileData { public static List<InfoObj> infoList = new LinkedList<InfoObj>(); private static final String FILE_NAME = "watcher_log"; public static final String ZIP_FILE_NAME = "logZip"; private static final int BUFF_SIZE = 2 * 1024 * 1024; // 2M Byte /** * 每收集到2000条数据,保存一次文件 */ private static int MAX_PAGE_SIZE = 2000; /** * 上传附件最大不超过500k */ private static final int MAX_MAIL_ATTACHMENT_SIZE = 500; /** * 取得文件中的log日志 * @param file * @return */ public static String getFileData(){ String content=""; File[] files = getLogFiles(); if(files == null) return ""; int size = files.length; for(int i = (size - 1);i>=0;i--){ File file = files[i]; content +="-------------------- log-"+(i + 1)+ "------------------------<br/>"; if (file !=null && file.exists()) { InputStream in = null; BufferedReader bufferedreader = null; try { in = new FileInputStream(file); if (in != null) { InputStreamReader inputstreamreader = new InputStreamReader(in); bufferedreader = new BufferedReader(inputstreamreader); String str = null; while ((str = bufferedreader.readLine()) != null) { content += str; } bufferedreader.close(); inputstreamreader.close(); in.close(); } } catch (FileNotFoundException e) { } catch (IOException e) { } } } return content; } /** * 取得最新的三个log日志文件 * @return */ private static File[] getLogFiles(){ File file = new File(Util.getSDCardDir() + "/log/quteWatcher/"); if(file.exists()){ File[] files = file.listFiles(); List<FileSortObj> mailFiles = new ArrayList<FileSortObj>(); for(File f:files){ FileSortObj obj = new FileSortObj(f,f.getName(),FILE_NAME); mailFiles.add(obj); } return getSortLogFiles(mailFiles); } return null; } public static synchronized void addData(InfoObj info){ if(info==null){ return; } infoList.add(info); if(infoList.size() > MAX_PAGE_SIZE){ saveFile(); infoList.clear(); } } /** * 取得所有压缩log文件 * 根据文件名取得最新的 1M 文件 * @return */ public static File[] getZipFiles() { File file = new File(Util.getSDCardDir() + "/log/zipFiles/"); if(file.exists()){ File[] files = file.listFiles(); List<FileSortObj> mailFiles = new ArrayList<FileSortObj>(); for(File f:files){ FileSortObj obj = new FileSortObj(f,f.getName(),ZIP_FILE_NAME); mailFiles.add(obj); } return getSortFiles(mailFiles); } return null; } /** * 对附件文件按名称中的时间戳排序,并选择最新的MAX_MAIL_ATTACHMENT_SIZE大小的附件按时间递减排序 */ private static File[] getSortFiles(List<FileSortObj> mailFiles ){ if(mailFiles == null) return null; List<File> files = new ArrayList<File>(); Collections.sort(mailFiles); long size = 0; for(FileSortObj obj : mailFiles){ size += obj.getFile().length() / 1000; if( size < MAX_MAIL_ATTACHMENT_SIZE){ files.add(obj.getFile()); } } return files.toArray(new File[]{}); } /** * 对附件文件按名称中的时间戳排序,并选择最新的3个附件 */ private static File[] getSortLogFiles(List<FileSortObj> mailFiles ){ if(mailFiles == null) return null; List<File> files = new ArrayList<File>(); Collections.sort(mailFiles); int num = 0; for(FileSortObj obj : mailFiles){ if( num < 3){ files.add(obj.getFile()); } else{ break; } num++; } return files.toArray(new File[]{}); } /** * 创建日志文件 */ private static File createLogFile(Date date){ return new File(Util.getSDCardDir() + "/log/quteWatcher/" + FILE_NAME + date.getTime()+ ".log"); } /** * 日志zip名称 * @param date * @return */ private static String createZipName(Date date){ return Util.getSDCardDir() + "/log/zipFiles/" + ZIP_FILE_NAME + date.getTime() + ".zip"; } /** * 保存infoList中的数据到文件中,并对生成该文件的压缩文件 */ public synchronized static void saveFile(){ if(FileData.infoList==null || FileData.infoList.size() == 0){ return; } File logFile = createLogFile(new Date()); StringBuffer buffer = new StringBuffer(getLogStr()); try { boolean saveResult = write(logFile,buffer); if(saveResult){ byte zipbuffer[] = new byte[BUFF_SIZE]; String zipName = createZipName(new Date()); File zipfile = new File(zipName); if(!checkAndCreadFile(zipfile)){ return; } try { ZipOutputStream outZip = new java.util.zip.ZipOutputStream( new java.io.FileOutputStream(zipName)); outZip.setMethod(ZipOutputStream.DEFLATED); outZip.setLevel(Deflater.BEST_SPEED); int len = 0; java.io.FileInputStream inputStream = new java.io.FileInputStream(logFile); java.util.zip.ZipEntry zipEntry = new java.util.zip.ZipEntry(logFile.getName()); zipEntry.setMethod(ZipOutputStream.DEFLATED); outZip.putNextEntry(zipEntry); while((len=inputStream.read(zipbuffer)) != -1) { outZip.write(zipbuffer, 0, len); } inputStream.close(); outZip.closeEntry(); outZip.finish(); outZip.close(); } catch (FileNotFoundException e) { } catch (IOException e) { } } } catch (IOException e) { } } /** * 检查文件是否存在,不存在则创建文件 * * @param file * @return * @throws IOException */ public static boolean checkAndCreadFile(File file) { boolean flag = true; // 文件不存在,要先创建文件,然后写入数据 if (!file.exists()) { file.getParentFile().mkdirs(); try { flag = file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } return flag; } /** * 创建日志文件 * @param file * @param buffer * @return * @throws IOException */ public static boolean write(File file, StringBuffer buffer) throws IOException { FileOutputStream fout; // 文件不存在,要先创建文件,然后写入数据 if (!checkAndCreadFile(file)) { return false; } fout = new FileOutputStream(file, true); fout.write(buffer.toString().getBytes()); fout.close(); return true; } public static String getLogStr(){ StringBuffer debugStr = new StringBuffer(); if(FileData.infoList!=null){ int size = FileData.infoList.size(); for (int i = 0; i < size; i++) { InfoObj info = FileData.infoList.get(i); String str = null; if(info!=null){ str = info.getTagTitle() + "   " + info.getInfo(); str = InfoObj.COLOR_MAP.get(info.getType()) + str + "</font>"; } if(str==null) str=""; debugStr.append(str + "<br/>"); } } return debugStr.toString(); } public static void cleanData(){ infoList.clear(); deleteFiles(Util.getSDCardDir() + "/log/quteWatcher/"); deleteFiles(Util.getSDCardDir() + "/log/zipFiles/"); } /** * 删除目录下所有文件 * @param fileRoot */ private static void deleteFiles(String fileRoot) { File file = new File(fileRoot); if(file.exists()){ File[] files = file.listFiles(); for(File f:files){ f.delete(); } } } }