最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java異步寫日志到文件中實現(xiàn)代碼

 更新時間:2017年04月24日 11:19:10   作者:nature_fly088  
這篇文章主要介紹了java異步寫日志到文件中實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下

java異步寫日志到文件中詳解

實現(xiàn)代碼:

package com.tydic.ESUtil; 
 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.PrintWriter; 
import java.util.Properties; 
 
public class LogWriter { 
// 日志的配置文件 
  public static final String LOG_CONFIGFILE_NAME = "log.properties"; 
  // 日志文件名在配置文件中的標(biāo)簽 
  public static final String LOGFILE_TAG_NAME = "logfile"; 
   
  // 默認(rèn)的日志文件的路徑和文件名稱 
  private final String DEFAULT_LOG_FILE_NAME = "./logtext.log"; 
  // 該類的唯一的實例 
  private static LogWriter logWriter; 
  // 文件輸出流 
  private PrintWriter writer;  
  // 日志文件名 
  private String logFileName;  
  /** 
   * 默認(rèn)構(gòu)造函數(shù) 
   */ 
  private LogWriter() throws LogException{ 
    this.init(); 
  } 
  private LogWriter(String fileName) throws LogException{ 
    this.logFileName = fileName; 
    this.init(); 
  } 
  /** 
   * 獲取LogWriter的唯一實例。 
   * @return 
   * @throws LogException 
   */ 
  public synchronized static LogWriter getLogWriter()throws LogException{ 
    if (logWriter == null){ 
      logWriter = new LogWriter(); 
    } 
    return logWriter; 
  } 
  public synchronized static LogWriter getLogWriter(String logFileName)throws LogException{ 
    if (logWriter == null){ 
      logWriter = new LogWriter(logFileName); 
    } 
    return logWriter; 
  } 
 
  /** 
   * 往日志文件中寫一條日志信息 
   * 為了防止多線程同時操作(寫)日志文件,造成文件”死鎖”。使用synchronized關(guān)鍵字 
   * @param logMsg  日志消息 
   */ 
  public synchronized void log(String logMsg) { 
    this.writer.println(new java.util.Date() + ": " + logMsg); 
  } 
  /** 
   * 往日志文件中寫一條異常信息 
   * 使用synchronized關(guān)鍵字。 
   * @param ex  待寫入的異常 
   */ 
  public synchronized void log(Exception ex) { 
    writer.println(new java.util.Date() + ": "); 
    ex.printStackTrace(writer); 
  } 
 
  /** 
   * 初始化LogWriter 
   * @throws LogException 
   */ 
  private void init() throws LogException{ 
    //如果用戶沒有在參數(shù)中指定日志文件名,則從配置文件中獲取。 
    if (this.logFileName == null){ 
      this.logFileName = this.getLogFileNameFromConfigFile(); 
      //如果配置文件不存在或者也沒有指定日志文件名,則用默認(rèn)的日志文件名。 
      if (this.logFileName == null){ 
        this.logFileName = DEFAULT_LOG_FILE_NAME; 
      } 
    } 
    File logFile = new File(this.logFileName); 
    try { 
      // 其中的FileWriter()中的第二個參數(shù)的含義是:是否在文件中追加內(nèi)容 
      // PrintWriter()中的第二個參數(shù)的含義是:自動將數(shù)據(jù)flush到文件中 
      writer = new PrintWriter(new FileWriter(logFile, true), true); 
      System.out.println("日志文件的位置:" + logFile.getAbsolutePath()); 
    } catch (IOException ex) { 
      String errmsg = "無法打開日志文件:" + logFile.getAbsolutePath(); 
      // System.out.println(errmsg); 
      throw new LogException(errmsg, ex); 
    } 
  } 
  /** 
   * 從配置文件中取日志文件名 
   * @return 
   */ 
  private String getLogFileNameFromConfigFile() {  
    try {  
      Properties pro = new Properties();  
      //在類的當(dāng)前位置,查找屬性配置文件log.properties  
      InputStream fin = getClass().getResourceAsStream(LOG_CONFIGFILE_NAME);  
      if (fin != null){ 
        pro.load(fin);//載入配置文件 
        fin.close();  
        return pro.getProperty(LOGFILE_TAG_NAME); 
      } else { 
        System.err.println("無法打開屬性配置文件: log.properties" );  
      } 
    }catch (IOException ex) {  
      System.err.println("無法打開屬性配置文件: log.properties" );  
    } 
    return null; 
  } 
  //關(guān)閉LogWriter 
  public void close() { 
    logWriter = null; 
    if (writer != null){ 
      writer.close(); 
    } 
  } 
 
  public static void main(String[] args) { 
    LogWriter logger = null; 
    try { 
      String fileName = "d:/temp/logger.log"; 
      logger = LogWriter.getLogWriter(fileName); 
//     logger.log("First log!"); 
//     logger.log("第二個日志信息"); 
//     logger.log("Third log"); 
//     logger.log("第四個日志信息"); 
      String content="tableaA|device_number|13701010"; 
      StringBuffer sb=new StringBuffer(); 
      for(int i=0;i<1000000;i++){ 
        sb.append(content).append(i).append(";\n"); 
      } 
      content=sb.toString(); 
      long startTime=System.currentTimeMillis(); 
      logger.log(content); 
      long endTime=System.currentTimeMillis(); 
      System.out.println("總消耗時間:"+(endTime-startTime)); 
      logger.close(); 
//     ReadFromFile.readFileByLines(fileName); 
    } catch (LogException e) { 
      e.printStackTrace(); 
    } 
  } 
} 

 

package com.tydic.ESUtil; 
 
public class AychWriter extends Thread { 
  private String content; 
  public AychWriter(String content){ 
    this.content=content; 
  } 
  @Override 
  public void run(){ 
    System.out.println("開始執(zhí)行run()"); 
    LogWriter logger = null; 
    String fileName = "d:/temp/logger.log"; 
    long startTime=System.currentTimeMillis(); 
    try { 
      logger = LogWriter.getLogWriter(fileName); 
      logger.log(this.content); 
    } catch (LogException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
    } 
 
    long endTime=System.currentTimeMillis(); 
    System.out.println("總消耗時間:"+(endTime-startTime)); 
  } 
} 

測試類:

package com.tydic.ESUtil; 
 
import java.io.FileWriter; 
import java.io.IOException; 
 
import org.junit.Test; 
 
public class test_test { 
  /** 
   * 同步向指定文件尾部寫入字符串 
   */ 
public void testAppendMethodB(String fileName,String content) throws IOException{ 
    try { 
      //打開一個寫文件器,構(gòu)造函數(shù)中的第二個參數(shù)true表示以追加形式寫文件 
      FileWriter writer = new FileWriter(fileName, true); 
      writer.write(content); 
      writer.close(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
    } 
 
/** 
 *調(diào)用上面同步寫方法 
 */ 
  @Test 
  public void testWriteTOFile() throws IOException{ 
    String fileName = "d:\\test.txt"; 
    String content="tableaA|device_number|13701010"; 
    StringBuffer sb=new StringBuffer(); 
    for(int i=0;i<100000;i++){ 
      sb.append(content).append(i).append(";\n"); 
    } 
    content=sb.toString(); 
    long startTime=System.currentTimeMillis(); 
    testAppendMethodB(fileName,content); 
    long endTime=System.currentTimeMillis(); 
    System.out.println("總消耗時間:"+(endTime-startTime)); 
  } 
  /** 
   * 異步調(diào)用寫方法 
   * @throws IOException 
   * @throws InterruptedException 
   */ 
  @Test 
  public void testAsyncWriteTOFile() throws IOException, InterruptedException{ 
    String fileName = "d:\\test.txt"; 
    String content="tableaA|device_number|13701010"; 
    StringBuffer sb=new StringBuffer(); 
    for(int i=0;i<100000;i++){ 
      sb.append(content).append(i).append(";\n"); 
    } 
    content=sb.toString(); 
    System.out.println("start write..."); 
    new AychWriter(content).start(); 
    System.out.println("write over..."); 
    Thread.sleep(30000); //重要,如果主線程掛了,調(diào)用線程也停止了 
    System.out.println("main Thread over"); 
  } 
   
} 

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • springboot X-Accel-Redirect 大文件下載實現(xiàn)

    springboot X-Accel-Redirect 大文件下載實現(xiàn)

    本文主要介紹了springboot X-Accel-Redirect 大文件下載實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java中的static--靜態(tài)變量你了解嗎

    Java中的static--靜態(tài)變量你了解嗎

    Java 中被 static 修飾的成員稱為靜態(tài)成員或類成員。它屬于整個類所有,而不是某個對象所有,即被類的所有對象所共享。靜態(tài)成員可以使用類名直接訪問,也可以使用對象名進行訪問,.下面我們來詳細(xì)了解一下吧
    2021-09-09
  • 淺談Thread.sleep()為什么要拋出中斷異常

    淺談Thread.sleep()為什么要拋出中斷異常

    本文主要介紹了淺談Thread.sleep()為什么要拋出中斷異常,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java動態(tài)規(guī)劃方式解決不同的二叉搜索樹

    Java動態(tài)規(guī)劃方式解決不同的二叉搜索樹

    二叉搜索樹作為一個經(jīng)典的數(shù)據(jù)結(jié)構(gòu),具有鏈表的快速插入與刪除的特點,同時查詢效率也很優(yōu)秀,所以應(yīng)用十分廣泛。本文將詳細(xì)講講二叉搜索樹的原理與實現(xiàn),需要的可以參考一下
    2022-10-10
  • JDBC中Statement的Sql注入問題詳解

    JDBC中Statement的Sql注入問題詳解

    這篇文章主要介紹了JDBC中Statement的Sql注入問題詳解,sql注入攻擊指的是通過構(gòu)建特殊的輸入作為參數(shù)傳入web應(yīng)用程序,而這些輸入大都是sql語法里的一些組合,通過執(zhí)行sql語句進而執(zhí)行攻擊者所要做的操作,需要的朋友可以參考下
    2023-10-10
  • SpringBoot基于redis自定義注解實現(xiàn)后端接口防重復(fù)提交校驗

    SpringBoot基于redis自定義注解實現(xiàn)后端接口防重復(fù)提交校驗

    本文主要介紹了SpringBoot基于redis自定義注解實現(xiàn)后端接口防重復(fù)提交校驗,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java中try-catch的使用及注意細(xì)節(jié)

    Java中try-catch的使用及注意細(xì)節(jié)

    現(xiàn)在有很多的語言都支持try-catch,比如常見的就是c++,java等,這篇文章主要給大家介紹了關(guān)于Java中try-catch的使用及注意細(xì)節(jié)的相關(guān)資料,文中通過圖文以及實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • java獲取當(dāng)前時間并格式化代碼實例

    java獲取當(dāng)前時間并格式化代碼實例

    這篇文章主要介紹了java獲取當(dāng)前時間并格式化代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • 淺談Spring IoC容器的依賴注入原理

    淺談Spring IoC容器的依賴注入原理

    這篇文章主要介紹了淺談Spring IoC容器的依賴注入原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • idea項目代碼打包為jar包的超詳細(xì)步驟

    idea項目代碼打包為jar包的超詳細(xì)步驟

    因為業(yè)務(wù)開發(fā)場景需要,將開發(fā)項目中的Java類打成一個jar包引入到外部工具中,下面這篇文章主要給大家介紹了關(guān)于idea項目代碼打包為jar包的相關(guān)資料,需要的朋友可以參考下
    2023-01-01

最新評論

冷水江市| 三台县| 闵行区| 南丰县| 勐海县| 饶阳县| 张家港市| 古交市| 潞城市| 阜新市| 和林格尔县| 乃东县| 中江县| 卫辉市| 安泽县| 庄河市| 安塞县| 延川县| 景德镇市| 武陟县| 建昌县| 金塔县| 泸溪县| 呼和浩特市| 恭城| 双牌县| 无锡市| 南华县| 界首市| 塔城市| 莒南县| 芷江| 日照市| 布尔津县| 当阳市| 安塞县| 凌源市| 商城县| 汉阴县| 唐山市| 宜春市|