common.io中Tailer类读取文件内容乱码问题解决
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类读取文件内容乱码问题解决相关推荐
- VS2019读取文件中文乱码问题解决
在vs2019中读取txt文件里中文时会出现这样的乱码情况 其实解决起来很简单 把讲到读取的文件找到 将文件另存为,文件编码改成ANSI格式 然后重新读取 ok这样就解决了
- .rpt文件内容读取java_Java 中读取文件内容的 n 中方式
前言 刚接触 java 的时候很困惑一个事情 File相对路径,以哪个目录为参照物. 随着 io 模型的发展,java 1.7 的 nio,使用 Path.Paths 和 Files 等来方便 io ...
- 1.5 RandomAccessFile类:动态读取文件内容
所谓动态读取是指从文件的任意位置开始访问文件,而不是必须从文件开始位置读取到文件末尾.动态读取需要用到 Java 中的 RandomAccessFile 类. RandomAccessFile 是 J ...
- C#中读取文件内容本文分步介绍了如何从文本文件
------- <a href="http://***" target="blank">Windows Phone 7手机开发</a>. ...
- 【FTP工具类】提供FTP服务器的连接, 查找文件目录,及读取文件内容等操作
介绍:FTP工具类,提供FTP服务器的连接, 查找文件目录,及读取文件内容等操作. 应用场景: 通过FTP连接需要获取文件目录列表 通过FTP连接读取指定文件内容 递归读取遍历服务器上所有文件 其他功 ...
- java中如何读取文件内容,附源代码
Java File类(文件操作类)详解在Java中,File类是java.io包中唯一代表磁盘文件本身的对象,也就是说,如果希望在程序中操作文件和目录,则都可以通过File类来完成.File类定义了一 ...
- python中读取文件内容-深入学习python解析并读取PDF文件内容的方法
这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...
- java ftp读取文件内容_java读取ftp中TXT文件的案例
最近在开发关于java读取ftp中TXT文件,其中有些坑踩了一下,再次做个记录 1.读取文件时我会根据文件名称去生成数据库表,oracle数据库对于表名的长度是有限制的,最多30个字符 2.对于多个文 ...
- python文件读取输出-python分批定量读取文件内容,输出到不同文件中的方法
一.文件内容的分发 应用场景:分批读取共有358086行内容的txt文件,每取1000条输出到一个文件当中 # coding=utf-8 # 分批读取共有358086行内容的txt文件,每取1000条 ...
最新文章
- 云主机启动提示Booting from Hard Disk GRUB
- Linux的mount命令简介
- zoj 3351 Bloodsucker(概率 dp)
- 深入详解windows安全认证机制ntlmKerberos
- H3C S5120-52P-WiNet交换机配置
- 水滴公司再回应“线下违规”:核心是公司的管理问题
- ajax调用外域接口不进回调函数_网易实战分享云信IM SDK接口设计实践
- 比较默认对象和默认约束的异同_UE4对象类类型引用和类默认对象(Class Default Object,简称CDO)...
- AIAR 应用的高效开发,OPPO 技术开放日第三期圆满落幕!
- Android NDK JNI C++ 3
- php俄语包,俄语资源汇总 - 俄语 | Russian | Pусский - 声同小语种论坛 - Powered by phpwind...
- 乾颐堂现任明教教主(2014年课程)TCPIP协议详解卷一 第五节课笔记
- 5.1(电脑技能经验) 美图秀秀批量处理图片大小,针对CSDN博客上传图片要求,小于2M,图片大小设计712*400
- 同时收到多家公司offer,怎样选择?
- php 安装扩展管理工具 pecl
- Java 习题 (12)
- 使用腾讯云模板发送短信验证码
- 水水水水水水水水水水水水水水水水水水水
- Echarts漂亮水滴图
- python一行代码实现白噪声检测
热门文章
- 支付宝小程序模板开发,一整套流程
- 红米路由器ac2100怎样设置ipv6_红米(Redmi)路由器AC2100怎么设置WiFi密码?
- C++图论 最短路问题总结
- JRebel 热部署
- TerraSAR-X雷达遥感卫星
- oracle 授予 sequence,Oracle中的角色和权限授予
- Found duplicate PV SdqCHHILXNSG1bLLLqtZ9fAv6sGTtiqj的解决方法
- Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解
- 20年9月wust招新赛writeup
- SAP-基于批次特定计量单位的应用-01-产品数量管理