package com.bestpay.o2o.reconciliation.biz.utils; import com.bestpay.ext.logback.util.TraceLogIdUtil; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; import org.slf4j.helpers.BestpayMarker; import java.io.*; import java.util.ArrayList; import java.util.List; /** * * 讀寫 工具類 * 超過百兆的文件 最好不要用此類 哈哈 * @author wangchunyang */ public class FileUtils { public static final Logger logger = LoggerFactory.getLogger(FileUtils.class); /** * 指定目錄下創建空文件 * * @param filePath * @param fileName * @return */ public static Boolean createNewFile(String filePath, String fileName) { // 如果dir不以文件分隔符結尾,自動添加文件分隔符 防止跨平台出現路徑問題 if (!filePath.endsWith(File.separator)) { filePath = filePath + File.separator; } //文件夾不存在則新建 File fileDir = new File(filePath); if (!fileDir.exists()) { fileDir.setWritable(true); fileDir.mkdirs(); } //新建文件 File myFile = new File(filePath, fileName); try { myFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); } return true; } /** * 讀文件 * @param filePath /Users/baonier/Downloads/ * @param fileName 2018.txt * @return */ public static List<String[]> readerFile(String filePath, String fileName){ MDC.put(BestpayMarker.TRACE_LOG_ID, TraceLogIdUtil.createTraceLogId()); logger.info("call[FileUtils][readerFile]PARAMETER:[" + filePath+fileName + "]"); long currentTime = System.currentTimeMillis(); // 如果dir不以文件分隔符結尾,自動添加文件分隔符 防止跨平台出現路徑問題 if (!filePath.endsWith(File.separator)){ filePath = filePath + File.separator; } // Text文件 File file = new File(filePath+fileName); // 構造一個BufferedReader類來讀取文件 BufferedReader br = null; String s = null; String[] readers = null; List<String[]> readersList = new ArrayList<>(); try { logger.info("開始讀取文件路徑:"+filePath+"中的:"+fileName); long readerTime = System.currentTimeMillis(); br = new BufferedReader(new FileReader(file)); // 使用readLine方法,一次讀一行 while ((s = br.readLine()) != null) { //拆分 readers = s.split("\\|"); //添加到集合中 readersList.add(readers); } logger.info("讀取文件路徑:"+filePath+"中的:"+fileName+"一共耗時:"+(System.currentTimeMillis()-readerTime)); } catch (IOException e) { logger.error("讀取文件路徑:"+filePath+"中的:"+fileName+"發生異常,異常信息是:", e); return null; }finally { try { if (br != null){ br.close(); } } catch (IOException e) { logger.error("關閉讀取文件流發生異常,異常信息是:", e); return null; } } logger.info("call[FileUtils][readerFile]PARAMETER:[" + filePath+fileName ,System.currentTimeMillis()-currentTime+"]"); return readersList; } /** * 寫文件 * @param readersList 數據 * @param filePath 路徑 本地路徑 * @param fileName 文件名 遠程文件名稱.txt * @param controlWriterNum 從第幾行開始寫 例如: 從第2行開始 參數寫 2 * @Param wmFlag 標識 主要用於物美商戶 * @Param iphone 標識 手機號 * @return */ public static Boolean writerFile(List<String[]> readersList,String filePath,String fileName, int controlWriterNum,String isWmMerchant, String iphone){ MDC.put(BestpayMarker.TRACE_LOG_ID, TraceLogIdUtil.createTraceLogId()); logger.info("call[FileUtils][writerFile]PARAMETER:[" + filePath+fileName + "]"); long currentTime = System.currentTimeMillis(); FileWriter fw = null; File file = new File(filePath+fileName); int writerNum = 0; // 如果dir不以文件分隔符結尾,自動添加文件分隔符 防止跨平台出現路徑問題 if (!filePath.endsWith(File.separator)){ filePath = filePath + File.separator; } try { //如果文件存在 那么刪除它 if (file.exists()){ file.getAbsolutePath(); boolean isDelete = deleteFile(filePath+fileName); if (isDelete){ logger.info("文件已存在,原文件已刪除"); } file.createNewFile(); } fw = new FileWriter(filePath+fileName); logger.info("開始寫入文件路徑:"+filePath+"中的:"+fileName); long writerTime = System.currentTimeMillis(); for (String[] readers:readersList) { writerNum++; if (writerNum < controlWriterNum){ continue; } //物美對賬專用 if ("WuMartMerchant".equals(isWmMerchant)){ //處理物美對賬文件 handlerWuMartFile(readers,fw,iphone); }else { //普通的寫文件 for (String reader:readers) { fw.write(reader); } } } logger.info("寫入文件路徑:"+filePath+"中的:"+fileName+"一共耗時:"+(System.currentTimeMillis()-writerTime)); } catch (IOException e) { logger.error("寫入文件路徑:"+filePath+"中的:"+fileName+"發生異常,異常信息是:", e); //出現異常刪除已經寫的文件 if (!file.exists()) { logger.error("刪除文件失敗:" + fileName + "不存在!"); return false; } else { //如果是文件 if (file.isFile()){ deleteFile(filePath+fileName); } //如果是文件夾 else{ deleteDirectory(fileName); } } return false; }finally { try { if (fw != null){ fw.close(); } } catch (IOException e) { logger.error("關閉寫入文件流發生異常,異常信息是:", e); return false; } } logger.info("call[FileUtils][writerFile]PARAMETER:[" + filePath+fileName ,System.currentTimeMillis()-currentTime+"]"); return true; } /** * 處理物美對賬文件 * @param readers 讀取到的數據 * @param fw * @param iphone 手機號 */ public static void handlerWuMartFile(String[] readers,FileWriter fw,String iphone){ for (int i = 0; i < readers.length; i++){ //替換指定的字段 2 6 7 if (i==2){ //手機號 readers[2]=iphone; } if (i==6){ //交易類型 if (readers[6].equals("0001")){ readers[6]="00"; } if (readers[6].equals("0002")){ readers[6]="01"; } } if (i==7){ //手續費 int amt = Integer.parseInt(readers[7]); amt = Math.abs(amt); readers[7]=String.valueOf(amt); } try { fw.write(readers[i]); fw.write(","); //此處暫時寫死, 寫完一行補位兩個0, 待擴展 fw.write("0,0"); //系統的換行符 fw.write(System.getProperty("line.separator")); } catch (IOException e) { e.printStackTrace(); } } } /** * 刪除單個文件 * * @param fileName * 要刪除的文件的文件名 * @return 單個文件刪除成功返回true,否則返回false */ public static boolean deleteFile(String fileName) { File file = new File(fileName); // 如果文件路徑所對應的文件存在,並且是一個文件,則直接刪除 if (file.exists() && file.isFile()) { if (file.delete()) { logger.error("刪除單個文件" + fileName + "成功!"); return true; } else { logger.error("刪除單個文件" + fileName + "失敗!"); return false; } } else { logger.error("刪除單個文件失敗:" + fileName + "不存在!"); return false; } } /** * 刪除目錄及目錄下的文件 * * @param dir * 要刪除的目錄的文件路徑 * @return 目錄刪除成功返回true,否則返回false */ public static boolean deleteDirectory(String dir) { // 如果dir不以文件分隔符結尾,自動添加文件分隔符 防止跨平台出現路徑問題 if (!dir.endsWith(File.separator)){ dir = dir + File.separator; } File dirFile = new File(dir); // 如果dir對應的文件不存在,或者不是一個目錄,則退出 if ((!dirFile.exists()) || (!dirFile.isDirectory())) { logger.error("刪除目錄失敗:" + dir + "不存在!"); return false; } boolean flag = true; // 刪除文件夾中的所有文件包括子目錄 File[] files = dirFile.listFiles(); for (int i = 0; i < files.length; i++) { // 刪除子文件 if (files[i].isFile()) { /* getAbsolutePath() 方法返回文件的絕對路徑,如果構造的時候是全路徑就直接返回全路徑, 如果構造時是相對路徑,就返回當前目錄的路徑 + 構造 File 對象時的路徑 */ flag = deleteFile(files[i].getAbsolutePath()); if (!flag){ break; } } // 刪除子目錄 else if (files[i].isDirectory()) { flag = deleteDirectory(files[i] .getAbsolutePath()); if (!flag){ break; } } } if (!flag) { logger.error("刪除目錄失敗!"); return false; } // 刪除當前目錄 if (dirFile.delete()) { logger.error("刪除目錄" + dir + "成功!"); return true; } else { return false; } } }
使用者需要稍作修改 !!!