• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > java异步写日志到文件中实现代码

java异步写日志到文件中实现代码

作者:nature_fly088 字体:[增加 减小] 来源:互联网 时间:2017-05-28

nature_fly088 通过本文主要向大家介绍了java异步处理,java 异步,java 异步线程,java异步调用,java异步编程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

java异步写日志到文件中详解

实现代码:

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"; 
  // 日志文件名在配置文件中的标签 
  public static final String LOGFILE_TAG_NAME = "logfile"; 
   
  // 默认的日志文件的路径和文件名称 
  private final String DEFAULT_LOG_FILE_NAME = "./logtext.log"; 
  // 该类的唯一的实例 
  private static LogWriter logWriter; 
  // 文件输出流 
  private PrintWriter writer;  
  // 日志文件名 
  private String logFileName;  
  /** 
   * 默认构造函数 
   */ 
  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关键字 
   * @param logMsg  日志消息 
   */ 
  public synchronized void log(String logMsg) { 
    this.writer.println(new java.util.Date() + ": " + logMsg); 
  } 
  /** 
   * 往日志文件中写一条异常信息 
   * 使用synchronized关键字。 
   * @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{ 
    //如果用户没有在参数中指定日志文件名,则从配置文件中获取。 
    if (this.logFileName == null){ 
      this.logFileName = this.getLogFileNameFromConfigFile(); 
      //如果配置文件不存在或者也没有指定日志文件名,则用默认的日志文件名。 
      if (this.logFileName == null){ 
        this.logFileName = DEFAULT_LOG_FILE_NAME; 
      } 
    } 
    File logFile = new File(this.logFileName); 
    try { 
      // 其中的FileWriter()中的第二个参数的含义是:是否在文件中追加内容 
      // PrintWriter()中的第二个参数的含义是:自动将数据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();  
      //在类的当前位置,查找属性配置文件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; 
  } 
  //关闭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(); 
    } 
  } 
} 

</div>

 

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("开始执行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)); 
  } 
} 
</div>

测试类:

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 { 
      //打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件 
      FileWriter writer = new FileWriter(fileName, true); 
      writer.write(content); 
      writer.close(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
    } 
 
/** 
 *调用上面同步写方法 
 */ 
  @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)); 
  } 
  /** 
   * 异步调用写方法 
   * @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); //重要,如果主线程挂了,调用线程也停止了 
    System.out.println("main Thread over"); 
  } 
   
} 
</div>

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • java异步写日志到文件中实现代码
  • java 中同步、异步、阻塞和非阻塞区别详解
  • java异步写日志到文件中实现代码
  • java 中同步、异步、阻塞和非阻塞区别详解

相关文章

  • 2017-05-28Java实现MD5消息摘要算法
  • 2017-05-28spring boot和mybatis集成分页插件
  • 2017-05-28跟我学Java Swing之游戏设计(2)
  • 2017-05-28java 完全二叉树的构建与四种遍历方法示例
  • 2017-05-28Java中finalize()详解及用法
  • 2017-05-28命令提示符编译java的方法(必看篇)
  • 2017-05-28详解Spring Boot 定时任务的实现方法
  • 2017-05-28spring中@value注解需要注意的问题
  • 2017-05-28spring cglib 与 jdk 动态代理
  • 2017-05-28详解spring boot中使用JdbcTemplate

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • log4j的Appenders配置方法
    • java json字符串转JSONObject和JSONArray以及取值的实例
    • 简单谈谈RxJava和多线程并发
    • Java内部类_动力节点Java学院整理
    • 基于RxPaparazzo实现图片裁剪、图片旋转、比例放大缩小功能
    • MyBatis的嵌套查询解析
    • springMVC4之强大类型转换器实例解析
    • 详解前后端分离之Java后端
    • MyBatis 使用权威指南
    • Java this()和super()的使用注意

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有