成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

JAVA讀取HDFS的文件數(shù)據(jù)出現(xiàn)亂碼的解決方案

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

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

想寫(xiě)一個(gè)讀取HFDS上的部分文件數(shù)據(jù)做預(yù)覽的接口,根據(jù)網(wǎng)上的博客實(shí)現(xiàn)后,發(fā)現(xiàn)有時(shí)讀取信息會(huì)出現(xiàn)亂碼,例如讀取一個(gè)csv時(shí),字符串之間被逗號(hào)分割

英文字符串a(chǎn)aa,能正常顯示 中文字符串“你好”,能正常顯示 中英混合字符串如“aaa你好”,出現(xiàn)亂碼

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

解決思路

因?yàn)镠DFS支持6種字符集編碼,每個(gè)本地文件編碼方式又是極可能不一樣的,我們上傳本地文件的時(shí)候其實(shí)就是把文件編碼成字節(jié)流上傳到文件系統(tǒng)存儲(chǔ)。那么在GET文件數(shù)據(jù)時(shí),面對(duì)不同文件、不同字符集編碼的字節(jié)流,肯定不是一種固定字符集解碼就能正確解碼的吧。

那么解決方案其實(shí)有兩種

固定HDFS的編解碼字符集。比如我選用UTF-8,那么在上傳文件時(shí)統(tǒng)一編碼,即把不同文件的字節(jié)流都轉(zhuǎn)化為UTF-8編碼再進(jìn)行存儲(chǔ)。這樣的話在獲取文件數(shù)據(jù)的時(shí)候,采用UTF-8字符集解碼就沒(méi)什么問(wèn)題了。但這樣做的話仍然會(huì)在轉(zhuǎn)碼部分存在諸多問(wèn)題,且不好實(shí)現(xiàn)。 動(dòng)態(tài)解碼。根據(jù)文件的編碼字符集選用對(duì)應(yīng)的字符集對(duì)解碼,這樣的話并不會(huì)對(duì)文件的原生字符流進(jìn)行改動(dòng),基本不會(huì)亂碼。

我選用動(dòng)態(tài)解碼的思路后,其難點(diǎn)在于如何判斷使用哪種字符集解碼。參考下面的內(nèi)容,獲得了解決方案

java檢測(cè)文本(字節(jié)流)的編碼方式

需求:

某文件或者某字節(jié)流要檢測(cè)他的編碼格式。

實(shí)現(xiàn):

基于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);}}}

測(cè)試:

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

Google提供了檢測(cè)字節(jié)流編碼方式的包。那么方案就很明了了,先讀一些文件字節(jié)流,用工具檢測(cè)編碼方式,再對(duì)應(yīng)進(jìn)行解碼即可。

具體解決代碼

pom

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

從HDFS讀取部分文件做預(yù)覽的邏輯

// 獲取文件的部分?jǐn)?shù)據(jù)做預(yù)覽 public List<String> getFileDataWithLimitLines(String filePath, Integer limit) { FSDataInputStream fileStream = openFile(filePath); return readFileWithLimit(fileStream, limit); } // 獲取文件的數(shù)據(jù)流 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; } // 讀取最多l(xiāng)imit行文件數(shù)據(jù) 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()); } // 從文件數(shù)據(jù)流中讀取字節(jié)流 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(); } // 解碼字節(jié)流 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; } // 根據(jù)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的文件數(shù)據(jù)出現(xiàn)亂碼的解決方案的詳細(xì)內(nèi)容,更多關(guān)于JAVA讀取HDFS的文件亂碼的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品毛片久久久久久| 色哟哟国产精品| 在线免费一区三区| 一个色综合网站| 国内视频一区| 国产日韩精品一区二区三区在线| 国产91在线看| 91精品国产色综合久久| 国内精品视频666| 欧美天堂亚洲电影院在线播放| 日韩成人av影视| 久久视频一区| 日韩在线一区二区三区| 久久久夜夜夜| 秋霞av亚洲一区二区三| 久久久久久久高潮| 午夜一区二区三区视频| 免费亚洲一区| 久久先锋资源网| 成人app网站| 久久久亚洲精品一区二区三区| jlzzjlzz欧美大全| 久久九九国产精品| 欧美日韩国产三区| 亚洲色图在线播放| 中国女人久久久| 午夜精品一区二区三区电影天堂 | 免费精品视频在线| 欧美日韩一区三区| 国内精品写真在线观看| 日韩欧美色电影| 欧美一区网站| 亚洲色图欧美在线| 国产精品一卡| 蜜臀av性久久久久蜜臀aⅴ| 91麻豆精品国产91久久久使用方法 | av电影在线观看完整版一区二区| 日韩免费在线观看| 99久久精品免费| 国产精品第四页| 午夜亚洲激情| 久久成人麻豆午夜电影| 欧美一区二区三区免费视频| 99vv1com这只有精品| 中文字幕一区二区在线观看| 亚洲一区观看| 免费在线观看精品| 欧美一区二区三区电影| 97精品国产露脸对白| 日韩码欧中文字| 一本大道久久精品懂色aⅴ| 亚洲午夜三级在线| 337p亚洲精品色噜噜噜| 99国产精品久久久久久久久久| 亚洲欧美日韩久久| 在线视频一区二区免费| 成人免费三级在线| 亚洲色欲色欲www在线观看| 久久久久久久久久久久久久一区| 国产精品99久久不卡二区| 国产欧美综合在线| 免费毛片一区二区三区久久久| 国产在线精品一区在线观看麻豆| 精品国产自在久精品国产| 一区在线观看| 免费成人小视频| 2020日本不卡一区二区视频| 亚洲成人在线| 久久成人免费网| 国产日韩三级在线| 欧美亚洲网站| 成人一区二区三区| 一区二区三区在线播| 91麻豆精品国产综合久久久久久 | 欧美日韩aaa| 国产精品国产三级欧美二区| 日韩精品1区2区3区| 欧美大片顶级少妇| 99re热精品| 国产麻豆午夜三级精品| 国产精品免费免费| 91国产福利在线| 欧美不卡在线| 久久精品国产亚洲5555| 中文字幕av免费专区久久| 久热这里只精品99re8久| 99久久99久久精品国产片果冻| 亚洲一卡二卡三卡四卡五卡| 日韩欧美一卡二卡| 国产精品三上| 成人激情免费视频| 亚洲成人动漫av| 欧美精品一区二区久久婷婷| 久久国产精品亚洲77777| av色综合久久天堂av综合| 午夜在线电影亚洲一区| 久久精品视频免费观看| 色久综合一二码| 国内精品嫩模av私拍在线观看| 久久精品国产亚洲aⅴ| 日韩免费高清电影| 老鸭窝亚洲一区二区三区| 国产成人99久久亚洲综合精品| 亚洲欧美日韩系列| 欧美一区二区大片| 裸体丰满少妇做受久久99精品| 91丨porny丨最新| 久久精品国产亚洲aⅴ | 99久久免费国产| 男女男精品视频| 亚洲欧美日韩小说| 精品国产免费一区二区三区香蕉| 亚洲欧美精品| 91理论电影在线观看| 紧缚奴在线一区二区三区| 亚洲精品高清在线| 久久久亚洲精华液精华液精华液| 欧美视频一区二区三区| 国产一区二区精品| 色综合久久综合| 韩国视频一区二区| 亚洲三级电影网站| 2020国产精品自拍| 欧美日韩国产成人在线免费| 国产精品入口| 国精品一区二区三区| 成人性生交大合| 精品中文字幕一区二区| 午夜亚洲国产au精品一区二区| 国产精品第四页| 久久精品一区二区三区不卡 | 制服.丝袜.亚洲.另类.中文| 久久精品一二三区| 亚洲人成毛片在线播放女女| 午夜精品免费| 成人视屏免费看| 精品一区二区三区的国产在线播放| 亚洲成人综合在线| 亚洲欧美二区三区| 欧美韩国日本综合| 精品国产乱码久久久久久影片| 欧美日韩视频专区在线播放| 色婷婷狠狠综合| 亚洲综合国产激情另类一区| 亚洲精品自在在线观看| 国产精品久久7| 99久久久久久| 成人高清免费在线播放| 亚洲电影在线播放| 一区二区三区欧美久久| 亚洲同性gay激情无套| 国产精品丝袜一区| 欧美激情一区二区三区在线| 国产色综合久久| 久久精品欧美一区二区三区不卡 | 欧美日韩卡一卡二| 日本道在线观看一区二区| 久久精品盗摄| 国产乱码精品| 国产精品日本一区二区| 国产伦精品一区二区三区| 国产精品免费一区二区三区观看| 99日韩精品| 国产欧美一区二区色老头| 亚洲精品一品区二品区三品区| 一区视频在线| 亚洲国产精品一区制服丝袜 | 欧美不卡一区二区三区| 欧美一二三区在线| 欧美一区二区三区视频在线| 欧美一二三四区在线| 日韩你懂的电影在线观看| 日韩一区二区精品| 日韩一区二区在线观看| 日韩精品一区二区三区在线观看| 欧美videos大乳护士334| 久久亚洲一区二区三区四区| 久久精品欧美日韩| 国产精品乱码一区二三区小蝌蚪| 中文字幕第一区二区| 亚洲欧洲精品天堂一级| 亚洲视频小说图片| 亚洲国产成人av好男人在线观看| 亚洲第一会所有码转帖| 日韩avvvv在线播放| 久久99精品一区二区三区| 国产老肥熟一区二区三区| 国产成人啪免费观看软件| 成人av在线观| 91在线一区二区| 国色天香一区二区| 国产一区二区三区久久久久久久久 | 国产精品888| 99riav久久精品riav| 国内精品久久久久久久97牛牛 | 欧美一卡2卡3卡4卡| 精品国产乱码久久久久久免费| 久久久五月婷婷| 亚洲图片你懂的| 天天色天天操综合|