为什么80%的码农都做不了架构师?>>>   

怎么实现一个tail,一开始的想法是在本地或者内存记录下当前读取到的文件的位置,然后每隔一定时间检测下看看是否有更新,想好了之后就准备开始写,但是按照习惯,能偷懒绝对不动手的原则首先google了一把,果不其然,网上已经有实现方案了,二话不说,拷贝过来进行修改。

思路就是我刚才的思路,但是接下来这个思路有个问题,就是轮询的效率并不高,而且读取不是实时的,因为我要做远程的这种文件同步,延迟性的tail肯定不可取,所以加入jdk7的新特性,进行文件监控,这样每次文件有更新,将会第一时间被通知到,然后进行相关的tail操作,核心代码如下:

public void run() {long filePointer = 0;if (this.startAtBeginning) {filePointer = 0;} else {filePointer = this.targetFile.length();}try {this.tailing = true;RandomAccessFile file = new RandomAccessFile(targetFile, "r");while (this.tailing) {WatchKey key = watchService.take();for (WatchEvent<?> event : key.pollEvents()) {System.out.println("[Tail monitor ] " + event.context() + "  " + event.kind() + " was triggered");}long fileLength = this.targetFile.length();System.out.println("fileLength : " + fileLength);if (fileLength == 0) {System.out.println("fileLength : " + fileLength);Thread.sleep(sampleInterval);System.out.println("Sleep : " + sampleInterval);key.reset();continue;}if (fileLength < filePointer && fileLength != 0) {file = new RandomAccessFile(targetFile, "r");filePointer = 0;}if (fileLength > filePointer) {file.seek(filePointer);String line = file.readLine();while (line != null) {line = new String(line.getBytes("8859_1"), tailFileCharSet);this.fireNewLogFileLine(targetFile.getName(), line);line = file.readLine();}filePointer = file.getFilePointer();}key.reset();}file.close();} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}

具体的远程tail,请移步

http://git.oschina.net/grom/rainy

然后在测试的时候发觉到一个很坑爹的问题,读取出来的日志居然有乱码,经过排查,RandomAccessFile有下面的一句

 switch (c = read()) {

C是个char类型,这不是坑爹么,不读成byte,读成char,那你使用的什么编码?算了,按理说应该是8859-1,直接转下试试,果然成功

line = new String(line.getBytes("8859_1"), tailFileCharSet);

转载于:https://my.oschina.net/dwbin/blog/666918

[Rainy开发笔记]使用RandomAccessFile实现的Tail相关推荐

  1. QCustomPlot开发笔记(二):QCustomPlot用户交互、元素项以及特殊用法

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/124567140 红胖子(红模仿)的博文大全:开发技术集 ...

  2. 运维开发笔记整理-前后端分离

    运维开发笔记整理-前后端分离 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么要进行前后端分离 1>.pc, app, pad多端适应 2>.SPA开发式的流 ...

  3. iOS开发笔记-两种单例模式的写法

    iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h"st ...

  4. 【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理

    本系列文章由zhmxy555编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7405479 作者:毛星云    邮箱: happyl ...

  5. 【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍

    游戏开发笔记二十七 Direct3D 11入门级知识介绍 作者:毛星云    邮箱: happylifemxy@163.com    期待着与志同道合的朋友们相互交流 上一节里我们介绍了在迈入Dire ...

  6. Android移动APP开发笔记——最新版Cordova 5.3.1(PhoneGap)搭建开发环境

    引言 简单介绍一下Cordova的来历,Cordova的前身叫PhoneGap,自被Adobe收购后交由Apache管理,并将其核心功能开源改名为Cordova.它能让你使用HTML5轻松调用本地AP ...

  7. 安卓开发笔记——自定义广告轮播Banner(实现无限循环)

    关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...

  8. os-cocos2d游戏开发基础-进度条-开发笔记

     os-cocos2d游戏开发基础-进度条-开发笔记(十)   ios-cocos2d游戏开发基础-游戏音效-开发笔记(九)       ios-cocos2d游戏开发基础-CCLayer和Touch ...

  9. 【Visual C++】游戏开发笔记四十一 浅墨DirectX教程之九 为三维世界添彩:纹理映射技术(一)...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8523341 作者:毛星云(浅墨 ...

最新文章

  1. oracle exp导出分区表,【实验】【PARTITION】exp导出分区表数据
  2. anaconda不同虚拟环境下使用jupyter的问题
  3. Hyperledger Besu(4)身份许可
  4. 让 gRPC 提供 REST 服务
  5. AutoMapper的介绍与使用(二)
  6. 【Leetcode_easy】1103. Distribute Candies to People
  7. java在数组里面添加_java – 如何在数组中间添加?
  8. Spring Data JPA 概述 与 快速入门(操作 mysql 数据)
  9. 域名没备案使用七牛cdn加速
  10. RePast J介绍
  11. [猎豹网校]数据结构与算法_Java语言
  12. 武汉大学计算机学院程序大赛,“星网锐捷杯”华中区高校研究生程序设计大赛通知...
  13. 零基础Linux搭建虚拟专用网络(实现游戏局域网联机)
  14. MAC系统连接Windows共享文件的方法
  15. HTML基础 冲冲冲
  16. hbuilder边框代码是什么_HBuilder CSS 自定义代码块
  17. JAVA 使用 Random 实现概率 可控 抽奖算法
  18. L2-013 红色警报 (25 分)
  19. 【图像压缩】香农熵和差分进化算法多级图像阈值图像压缩【含Matlab源码 2035期】
  20. 防抖节流的实现与区分(详解带代码)

热门文章

  1. (二十)java多线程之ScheduledThreadPoolExecutor
  2. free -m 内存
  3. APACHE利用Limit模块限制IP连接数
  4. python方法和函数的格式是完全一样的_Python成为专业人士笔记-返回变量形式函数- str() 和 repr()...
  5. 水晶报表位置公式_高频、实用函数公式,提升您的工作效率!
  6. PLMN选择,RPLMN、EPLMN、UPLMN、OPLMN、VPLMN、APLMN、FPLMN的概念
  7. Notepad++自用主题推荐
  8. 当我们在讨论奢侈品行业时,人工智能可以做什么?
  9. Android静态安全检测 - WebView明文存储密码
  10. 用haproxy结合keepalived实现基于LNMP的负载均衡和高可用