common.io 是一个实用程序库,协助开发IO功能。

org.apache.comons.io.input 包针对SUN JDK IO包进行了扩展,实现了一些功能简单的IO类,主要包括了对字节/字符输入流接口的实现

在项目开发中(斯凯闪电狗-日志监控分析系统),出现了输出中文乱码的问题。具体跟踪到org.apache.comons.io.input.Tailer类中。

原因:通过把byte转化成char,然后由char变成String会造成中文乱码。(如果直接将byte转化成String,则不乱码)

   private long readLines(RandomAccessFile reader) throws IOException {StringBuilder sb = new StringBuilder();long pos = reader.getFilePointer();long rePos = pos; // position to re-readint num;boolean seenCR = false;while (run && ((num = reader.read(inbuf)) != -1)) {for (int i = 0; i < num; i++) {byte ch = inbuf[i];switch (ch) {case '\n':seenCR = false; // swallow CR before LFlistener.handle(sb.toString());sb.setLength(0);rePos = pos + i + 1;break;case '\r':if (seenCR) {sb.append('\r');}seenCR = true;break;default:if (seenCR) {seenCR = false; // swallow final CRlistener.handle(sb.toString());sb.setLength(0);rePos = pos + i + 1;}sb.append((char) ch); // add character, not its ascii value}}pos = reader.getFilePointer();}reader.seek(rePos); // Ensure we can re-read if necessaryreturn rePos;}

修改方法:通过byteBuffer来收集所有的byte,然后转化成String,则不会乱码。

修改为:

private long readLines(RandomAccessFile reader) throws IOException {StringBuilder sb = new StringBuilder();long pos = reader.getFilePointer();long rePos = pos; // position to re-readint num;boolean seenCR = false;ByteBuffer buffer = ByteBuffer.allocate(1024);while (run && ((num = reader.read(inbuf)) != -1)) {for (int i = 0; i < num; i++) {byte ch = inbuf[i];switch (ch) {case '\n':seenCR = false; // swallow CR before LF<span style="color:#FF0000;">//listener.handle(sb.toString());</span><span style="color:#FF0000;">buffer.flip();listener.handle(byteBufferToString(buffer));buffer.clear();</span>sb.setLength(0);rePos = pos + i + 1;break;case '\r':if (seenCR) {sb.append('\r');<span style="color:#FF0000;">buffer.put(new byte[] { '\r' });</span>}seenCR = true;break;default:if (seenCR) {seenCR = false; // swallow final CR<span style="color:#FF0000;">//listener.handle(sb.toString());</span><span style="color:#FF0000;">buffer.flip();listener.handle(byteBufferToString(buffer));buffer.clear();</span>sb.setLength(0);rePos = pos + i + 1;}sb.append((char) ch); // add character, not its ascii value<span style="color:#FF0000;">try{buffer.put(ch); //如果为空,可能出现NIO的一个异常}catch(Exception e){logger.error("向buffer中插入数据出错",e);}</span>}}pos = reader.getFilePointer();}reader.seek(rePos); // Ensure we can re-read if necessaryreturn rePos;}
<span style="color:#FF0000;"></span>

byteBuffer转化成String的方法:

 <span style="color:#FF0000;">private static String byteBufferToString(ByteBuffer buffer) {CharBuffer charBuffer = null;try {Charset charset = Charset.forName("UTF-8");CharsetDecoder decoder = charset.newDecoder();charBuffer = decoder.decode(buffer);buffer.flip();String result =  charBuffer.toString();return result;} catch (Exception ex) {ex.printStackTrace();return null;}}</span>

common.io中Tailer类读取文件内容乱码问题解决相关推荐

  1. VS2019读取文件中文乱码问题解决

    在vs2019中读取txt文件里中文时会出现这样的乱码情况 其实解决起来很简单 把讲到读取的文件找到 将文件另存为,文件编码改成ANSI格式 然后重新读取 ok这样就解决了

  2. .rpt文件内容读取java_Java 中读取文件内容的 n 中方式

    前言 刚接触 java 的时候很困惑一个事情 File相对路径,以哪个目录为参照物. 随着 io 模型的发展,java 1.7 的 nio,使用 Path.Paths 和 Files 等来方便 io ...

  3. 1.5 RandomAccessFile类:动态读取文件内容

    所谓动态读取是指从文件的任意位置开始访问文件,而不是必须从文件开始位置读取到文件末尾.动态读取需要用到 Java 中的 RandomAccessFile 类. RandomAccessFile 是 J ...

  4. C#中读取文件内容本文分步介绍了如何从文本文件

    ------- <a href="http://***" target="blank">Windows Phone 7手机开发</a>. ...

  5. 【FTP工具类】提供FTP服务器的连接, 查找文件目录,及读取文件内容等操作

    介绍:FTP工具类,提供FTP服务器的连接, 查找文件目录,及读取文件内容等操作. 应用场景: 通过FTP连接需要获取文件目录列表 通过FTP连接读取指定文件内容 递归读取遍历服务器上所有文件 其他功 ...

  6. java中如何读取文件内容,附源代码

    Java File类(文件操作类)详解在Java中,File类是java.io包中唯一代表磁盘文件本身的对象,也就是说,如果希望在程序中操作文件和目录,则都可以通过File类来完成.File类定义了一 ...

  7. python中读取文件内容-深入学习python解析并读取PDF文件内容的方法

    这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...

  8. java ftp读取文件内容_java读取ftp中TXT文件的案例

    最近在开发关于java读取ftp中TXT文件,其中有些坑踩了一下,再次做个记录 1.读取文件时我会根据文件名称去生成数据库表,oracle数据库对于表名的长度是有限制的,最多30个字符 2.对于多个文 ...

  9. python文件读取输出-python分批定量读取文件内容,输出到不同文件中的方法

    一.文件内容的分发 应用场景:分批读取共有358086行内容的txt文件,每取1000条输出到一个文件当中 # coding=utf-8 # 分批读取共有358086行内容的txt文件,每取1000条 ...

最新文章

  1. 云主机启动提示Booting from Hard Disk GRUB
  2. Linux的mount命令简介
  3. zoj 3351 Bloodsucker(概率 dp)
  4. 深入详解windows安全认证机制ntlmKerberos
  5. H3C S5120-52P-WiNet交换机配置
  6. 水滴公司再回应“线下违规”:核心是公司的管理问题
  7. ajax调用外域接口不进回调函数_网易实战分享云信IM SDK接口设计实践
  8. 比较默认对象和默认约束的异同_UE4对象类类型引用和类默认对象(Class Default Object,简称CDO)...
  9. AIAR 应用的高效开发,OPPO 技术开放日第三期圆满落幕!
  10. Android NDK JNI C++ 3
  11. php俄语包,俄语资源汇总 - 俄语 | Russian | Pусский - 声同小语种论坛 - Powered by phpwind...
  12. 乾颐堂现任明教教主(2014年课程)TCPIP协议详解卷一 第五节课笔记
  13. 5.1(电脑技能经验) 美图秀秀批量处理图片大小,针对CSDN博客上传图片要求,小于2M,图片大小设计712*400
  14. 同时收到多家公司offer,怎样选择?
  15. php 安装扩展管理工具 pecl
  16. Java 习题 (12)
  17. 使用腾讯云模板发送短信验证码
  18. 水水水水水水水水水水水水水水水水水水水
  19. Echarts漂亮水滴图
  20. python一行代码实现白噪声检测

热门文章

  1. 支付宝小程序模板开发,一整套流程
  2. 红米路由器ac2100怎样设置ipv6_红米(Redmi)路由器AC2100怎么设置WiFi密码?
  3. C++图论 最短路问题总结
  4. JRebel 热部署
  5. TerraSAR-X雷达遥感卫星
  6. oracle 授予 sequence,Oracle中的角色和权限授予
  7. Found duplicate PV SdqCHHILXNSG1bLLLqtZ9fAv6sGTtiqj的解决方法
  8. Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解
  9. 20年9月wust招新赛writeup
  10. SAP-基于批次特定计量单位的应用-01-产品数量管理