zoukankan      html  css  js  c++  java
  • 一个字符编码引发的血案

    有个工具类逐行读文本文件,读取数据然后放入内存中。代码如下:

    FSDataInputStream in = null;
    BufferedReader br = null;
    
    	FileSystem fs = FileSystem.get(new URI(somePath), new Configuration());
    	in = fs.open(new Path(somePath));
    	br = new BufferedReader(new InputStreamReader(in));
    	
    	while ((line = br.readLine()) != null) {
    		counter++;
    		dosomeoperation();
    	}
    

     代码设计是既可单机执行,又可在hadoop集群中运行,可是天不遂人愿。。。

    在linux单机运行时一切正常,当用于mapreduce中时总是缺少一些数据,具体查看时发现总行数比单机版的少。再测试发现在集群中时有的两行被认为是一行,这种情况全出现在前一行行尾有中文字符时,于是怀疑是编码问题。改一行代码之后断行正常并且运行正确:

    br = new BufferedReader(new InputStreamReader(in, Charset.forName("utf8")));
    

    即:显示设置reader的编码。

    虽然问题解决了,但还是很困惑。此文件在linux本地文件系统中是utf8的编码,用hadoop fs -put到集群中。put过程中会改变文件的编码还是集群的默认编码不是utf8?如何查看集群的当前默认编码呢?

  • 相关阅读:
    使用CDN后,PHP如何获取用户的真是IP?
    git常用命令整理
    svn常用命令
    Ansible 运维自动化(一)
    grep 简单笔记
    sed 笔记
    awk命令笔记
    无限极分类(一)获得树结构
    php自定义函数求取平方根
    class path resource [config.xml] cannot be opened because it does not exist
  • 原文地址:https://www.cnblogs.com/aprilrain/p/3057232.html
Copyright © 2011-2022 走看看