日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JAVA讀取HDFS的文件數據出現亂碼的解決方案

瀏覽:14日期:2022-08-21 09:51:08

使用JAVA api讀取HDFS文件亂碼踩坑

想寫一個讀取HFDS上的部分文件數據做預覽的接口,根據網上的博客實現后,發現有時讀取信息會出現亂碼,例如讀取一個csv時,字符串之間被逗號分割

英文字符串aaa,能正常顯示 中文字符串“你好”,能正常顯示 中英混合字符串如“aaa你好”,出現亂碼

查閱了眾多博客,解決方案大概都是:使用xxx字符集解碼。抱著不信的想法,我依次嘗試,果然沒用。

解決思路

因為HDFS支持6種字符集編碼,每個本地文件編碼方式又是極可能不一樣的,我們上傳本地文件的時候其實就是把文件編碼成字節流上傳到文件系統存儲。那么在GET文件數據時,面對不同文件、不同字符集編碼的字節流,肯定不是一種固定字符集解碼就能正確解碼的吧。

那么解決方案其實有兩種

固定HDFS的編解碼字符集。比如我選用UTF-8,那么在上傳文件時統一編碼,即把不同文件的字節流都轉化為UTF-8編碼再進行存儲。這樣的話在獲取文件數據的時候,采用UTF-8字符集解碼就沒什么問題了。但這樣做的話仍然會在轉碼部分存在諸多問題,且不好實現。 動態解碼。根據文件的編碼字符集選用對應的字符集對解碼,這樣的話并不會對文件的原生字符流進行改動,基本不會亂碼。

我選用動態解碼的思路后,其難點在于如何判斷使用哪種字符集解碼。參考下面的內容,獲得了解決方案

java檢測文本(字節流)的編碼方式

需求:

某文件或者某字節流要檢測他的編碼格式。

實現:

基于jchardet

<dependency><groupId>net.sourceforge.jchardet</groupId><artifactId>jchardet</artifactId><version>1.0</version></dependency>

代碼如下:

public class DetectorUtils {private DetectorUtils() {} static class ChineseCharsetDetectionObserver implementsnsICharsetDetectionObserver {private boolean found = false;private String result; public void Notify(String charset) {found = true;result = charset;} public ChineseCharsetDetectionObserver(boolean found, String result) {super();this.found = found;this.result = result;} public boolean isFound() {return found;} public String getResult() {return result;} } public static String[] detectChineseCharset(InputStream in)throws Exception {String[] prob=null;BufferedInputStream imp = null;try {boolean found = false;String result = Charsets.UTF_8.toString();int lang = nsPSMDetector.CHINESE;nsDetector det = new nsDetector(lang);ChineseCharsetDetectionObserver detectionObserver = new ChineseCharsetDetectionObserver(found, result);det.Init(detectionObserver);imp = new BufferedInputStream(in);byte[] buf = new byte[1024];int len;boolean isAscii = true;while ((len = imp.read(buf, 0, buf.length)) != -1) {if (isAscii)isAscii = det.isAscii(buf, len);if (!isAscii) {if (det.DoIt(buf, len, false))break;}} det.DataEnd();boolean isFound = detectionObserver.isFound();if (isAscii) {isFound = true;prob = new String[] { 'ASCII' };} else if (isFound) {prob = new String[] { detectionObserver.getResult() };} else {prob = det.getProbableCharsets();}return prob;} finally {IOUtils.closeQuietly(imp);IOUtils.closeQuietly(in);}}}

測試:

String file = 'C:/3737001.xml';String[] probableSet = DetectorUtils.detectChineseCharset(new FileInputStream(file));for (String charset : probableSet) {System.out.println(charset);}

Google提供了檢測字節流編碼方式的包。那么方案就很明了了,先讀一些文件字節流,用工具檢測編碼方式,再對應進行解碼即可。

具體解決代碼

pom

<dependency><groupId>net.sourceforge.jchardet</groupId><artifactId>jchardet</artifactId><version>1.0</version></dependency>

從HDFS讀取部分文件做預覽的邏輯

// 獲取文件的部分數據做預覽 public List<String> getFileDataWithLimitLines(String filePath, Integer limit) { FSDataInputStream fileStream = openFile(filePath); return readFileWithLimit(fileStream, limit); } // 獲取文件的數據流 private FSDataInputStream openFile(String filePath) { FSDataInputStream fileStream = null; try { fileStream = fs.open(new Path(getHdfsPath(filePath))); } catch (IOException e) { logger.error('fail to open file:{}', filePath, e); } return fileStream; } // 讀取最多limit行文件數據 private List<String> readFileWithLimit(FSDataInputStream fileStream, Integer limit) { byte[] bytes = readByteStream(fileStream); String data = decodeByteStream(bytes); if (data == null) { return null; } List<String> rows = Arrays.asList(data.split('rn')); return rows.stream().filter(StringUtils::isNotEmpty) .limit(limit) .collect(Collectors.toList()); } // 從文件數據流中讀取字節流 private byte[] readByteStream(FSDataInputStream fileStream) { byte[] bytes = new byte[1024*30]; int len; ByteArrayOutputStream stream = new ByteArrayOutputStream(); try { while ((len = fileStream.read(bytes)) != -1) { stream.write(bytes, 0, len); } } catch (IOException e) { logger.error('read file bytes stream failed.', e); return null; } return stream.toByteArray(); } // 解碼字節流 private String decodeByteStream(byte[] bytes) { if (bytes == null) { return null; } String encoding = guessEncoding(bytes); String data = null; try { data = new String(bytes, encoding); } catch (Exception e) { logger.error('decode byte stream failed.', e); } return data; } // 根據Google的工具判別編碼 private String guessEncoding(byte[] bytes) { UniversalDetector detector = new UniversalDetector(null); detector.handleData(bytes, 0, bytes.length); detector.dataEnd(); String encoding = detector.getDetectedCharset(); detector.reset(); if (StringUtils.isEmpty(encoding)) { encoding = 'UTF-8'; } return encoding; }

以上就是JAVA讀取HDFS的文件數據出現亂碼的解決方案的詳細內容,更多關于JAVA讀取HDFS的文件亂碼的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产成人免费av一区二区午夜| 亚洲精品成a人ⅴ香蕉片| 亚洲资源av| 久久国产成人午夜av影院宅| 麻豆久久久久久久| 亚洲欧美日本国产专区一区| 久久久久久久久久久9不雅视频| 国产精品亚洲二区| 欧美日韩亚洲一区在线观看| 日韩精品导航| 日韩国产精品久久久| 日韩高清二区| 欧美日韩视频免费看| 免费在线欧美视频| 蜜臀精品一区二区三区在线观看| 在线综合视频| 免费视频一区二区| 日韩在线黄色| 视频精品一区| 国产欧美亚洲精品a| 欧美片第1页综合| caoporn视频在线| 91精品国产成人观看| 久久国产影院| 欧美大黑bbbbbbbbb在线| 午夜久久一区| 综合五月婷婷| 国产欧美日韩视频在线| 国产探花一区二区| 久久精品国产99国产| caoporn视频在线| 极品裸体白嫩激情啪啪国产精品| 麻豆亚洲精品| 欧美亚洲综合视频| 免费日韩成人| 久久精品1区| 久久国产成人| 国产精品a级| 三上悠亚国产精品一区二区三区 | 在线日韩中文| 欧美中文日韩| 国产麻豆一区二区三区 | 国产亚洲精aa在线看| 欧美好骚综合网| 免费观看久久av| 午夜性色一区二区三区免费视频| 国产精品15p| 国产高清一区| 日本成人在线视频网站| 国产精品va| 久久国产欧美| 日韩av一区二区在线影视| 精品午夜av| 欧美日韩一区二区综合| 香蕉久久一区| 黄色在线观看www| 在线精品福利| 精品久久久网| 中文字幕日本一区| 韩国精品主播一区二区在线观看 | 日韩中出av| 中文字幕成在线观看| 在线免费观看亚洲| 日韩欧美午夜| 91精品啪在线观看国产爱臀| 夜鲁夜鲁夜鲁视频在线播放| 亚洲精品乱码日韩| 久久青草久久| 麻豆国产91在线播放| 亚洲在线观看| 香蕉成人av| 麻豆久久一区| 亚洲精品韩国| 久久天堂成人| 国产激情欧美| 韩日一区二区三区| 日韩久久99| 免费av一区二区三区四区| 国产精品4hu.www| 99国产精品久久久久久久| 精品国产亚洲一区二区三区在线| 中文字幕一区二区精品区| 成人午夜在线| 日韩精品欧美成人高清一区二区| 波多视频一区| 日本久久一区| 91久久黄色| 国产精品久久久久久久免费观看| 欧美日韩一区二区综合| 欧美亚洲免费| 香蕉久久一区| 国产亚洲欧美日韩精品一区二区三区 | 亚洲视频电影在线| 久久黄色影视| 三级在线观看一区二区| 欧美激情三区| 日韩精品中文字幕吗一区二区 | 一区二区三区国产盗摄| 久久伊人国产| 日韩精品欧美成人高清一区二区| 日韩国产欧美一区二区| 青草综合视频| 亚洲三级观看| 伊伊综合在线| 高清不卡一区| 欧美视频二区| 日本久久一区| 午夜电影亚洲| 婷婷亚洲综合| 国产成人久久精品麻豆二区 | 亚洲在线一区| 日韩深夜视频| 成人日韩av| 久久久久观看| 日韩中文一区二区| 好看的亚洲午夜视频在线| 国产精品成人自拍| 亚洲丝袜美腿一区| 欧美日韩尤物久久| 成人国产精品| 欧美好骚综合网| 国产精品伦一区二区| 日韩精品视频在线看| 99成人在线视频| 成人久久久久| аⅴ资源天堂资源库在线| 国精品产品一区| 国产精品一区二区三区av| 亚洲综合精品| 欧美特黄a级高清免费大片a级| 国产美女高潮在线观看| 国产精品一区二区美女视频免费看 | 日韩精品一级| 久久成人亚洲| 日韩一二三区在线观看| 麻豆亚洲精品| 亚洲v天堂v手机在线| 美女精品一区| 亚洲精品日本| 日本一区二区中文字幕| 日韩激情精品| 亚洲日本三级| 国产乱人伦精品一区| 久久午夜精品| 亚洲精品一二| 四虎精品一区二区免费| 97久久精品| 国产伦精品一区二区三区千人斩| 美女尤物国产一区| 久久精品资源| 肉色欧美久久久久久久免费看| 久久精品理论片| 成人高清一区| jiujiure精品视频播放| 亚洲精品一区二区在线看| 爽好多水快深点欧美视频| 喷白浆一区二区| 国产精品一区三区在线观看| 亚洲一级淫片| 欧美国产另类| 91精品久久久久久久久久不卡| 亚洲小说欧美另类婷婷| 欧洲激情综合| 日韩一区二区三区免费视频 | 欧美日韩va| 色偷偷偷在线视频播放| 国产精品久久久久av电视剧| 黄色日韩在线| 一区二区三区四区日韩| 牛牛精品成人免费视频| 精品国产麻豆| 伊人精品一区| 亚洲激情久久| 国产精品日本一区二区不卡视频| 久久精品国产一区二区| 电影亚洲精品噜噜在线观看| 喷白浆一区二区| 国产伦精品一区二区三区千人斩| 日韩美女一区二区三区在线观看| 激情丁香综合| 青草国产精品| 久久字幕精品一区| 99成人在线| 欧美日韩一区二区三区四区在线观看| av免费不卡国产观看| 欧美精品激情| 青草国产精品久久久久久| 精品三级国产| 中文不卡在线| 视频一区二区三区入口| 精品国产一区二区三区2021| www.com.cn成人| 美国欧美日韩国产在线播放| 成人台湾亚洲精品一区二区| 香蕉精品视频在线观看| 欧美日韩亚洲三区| 日韩专区精品| 国产精品一区二区美女视频免费看 | 欧美精品一区二区三区精品| 综合精品一区|