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

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

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

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

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

想寫一個(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字符集解碼。抱著不信的想法,我依次嘗試,果然沒用。

解決思路

因?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字符集解碼就沒什么問題了。但這樣做的話仍然會(huì)在轉(zhuǎ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)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
蘑菇福利视频一区播放| 亚洲欧美久久| 欧美激情日韩| 成人一区而且| 久久精品亚洲欧美日韩精品中文字幕| 国产精品地址| 国产一区二区亚洲| 欧美a级片一区| 日本亚洲视频在线| 国产精品一线天粉嫩av| 国产伦久视频在线观看| 午夜精品网站| 国产亚洲高清在线观看| 精品精品久久| 在线亚洲自拍| 国产激情一区| 国产精品试看| 国产精品不卡| 久久高清国产| 国内自拍视频一区二区三区| 久久精选视频| 亚洲久久在线| 日韩综合一区| 日韩亚洲精品在线观看| 91看片一区| 国产精品网址| 91九色精品| 青青国产精品| 91高清一区| 成人亚洲精品| 日本午夜精品一区二区三区电影| 国产不卡精品| 国产日韩一区二区三免费高清| 香蕉人人精品| 久久婷婷av| 7777精品| 视频一区视频二区中文| 国产精品99久久精品| 91精品日本| 丝袜亚洲精品中文字幕一区| 中文字幕人成乱码在线观看| 午夜性色一区二区三区免费视频| 久久免费国产| 国产拍在线视频| 日本黄色精品| 国产精品第一| 国产日韩欧美一区二区三区 | 婷婷色综合网| 久久精品五月| 日本成人一区二区| 国产精品日本| 蜜桃视频欧美| 欧美日韩第一| 国产一区久久| 宅男在线一区| 久久精品伊人| yellow在线观看网址| 国产一区二区精品久| 精品一区二区三区中文字幕视频 | 日韩一区免费| 欧美久久精品一级c片| 久久国产亚洲| 亚洲精品极品少妇16p| 亚洲免费播放| 亚洲综合丁香| 日韩1区2区3区| 国产精品一区二区三区四区在线观看 | 久久三级福利| 狠狠久久婷婷| 涩涩涩久久久成人精品| 欧美亚洲国产日韩| 久久三级毛片| 欧美成人久久| 亚洲欧美日韩专区| 91精品福利观看| 日韩欧美不卡| 亚洲另类黄色| 麻豆成人综合网| 欧美高清一区| 亚洲精品第一| 国产夫妻在线| 亚洲资源在线| 91偷拍一区二区三区精品| 在线综合视频| 九九九精品视频| 激情欧美一区| 国产欧美视频在线| 美女网站一区| 亚洲一区欧美激情| 麻豆一区二区三| 黄色日韩在线| 欧美激情另类| 一本一道久久a久久| 97se综合| 久久国际精品| 模特精品在线| 免费高潮视频95在线观看网站| 日本大胆欧美人术艺术动态| 国产精品久久久久久久久免费高清 | 国产欧美视频在线| 久久av一区| 久久亚洲人体| 奇米777国产一区国产二区| 韩日一区二区三区| 日韩精品1区| 国产不卡av一区二区| 日韩黄色在线观看| 天堂va蜜桃一区二区三区| 久久久成人网| 亚洲天堂一区二区| 国产拍在线视频| 久久精品国产网站| 国产麻豆一区二区三区精品视频| 免费精品视频最新在线| 黑丝美女一区二区| 欧美.日韩.国产.一区.二区 | 日韩精品福利一区二区三区| 久久高清国产| 丝袜美腿成人在线| 午夜在线精品| 中文视频一区| 视频一区日韩精品| 亚洲精品第一| 欧美一区自拍| 国产麻豆一区二区三区| 国产精品2区| 欧美国产另类| 国产黄大片在线观看| 国产精品亚洲一区二区三区在线观看| 精品久久精品| 福利片在线一区二区| 亚洲精品永久免费视频| 久久视频一区| 国产精品三上| 偷拍亚洲精品| 久久精品资源| 久久国产欧美| 亚洲天堂免费| 欧美激情 亚洲a∨综合| 伊人久久国产| 伊人国产精品| 久久久久黄色| 激情欧美日韩一区| 中文字幕亚洲影视| 国产精品久久久久久久久久白浆| 国产欧美一区二区三区精品观看| 高清在线一区| 激情婷婷综合| 国产精品大片| 怡红院精品视频在线观看极品| 欧美日韩网址| 亚洲高清av| 久久国产精品色av免费看| 天堂中文av在线资源库| 亚洲一区二区免费看| 国产精久久久| 亚洲一二三区视频| 一本大道色婷婷在线| 天堂精品久久久久| 久久久五月天| 久久精品99国产精品日本| 欧美影院三区| 精品久久免费| 欧美亚洲综合视频| 99热精品在线| 久久久久久久久久久9不雅视频| 国产欧美精品久久| 亚洲主播在线| 999久久久国产精品| 精品亚洲a∨| 国产精品男女| 午夜精品福利影院| 国产亚洲一区在线| 欧美一区二区三区高清视频| 免费看一区二区三区| 亚洲最大av| 日韩亚洲精品在线| 激情亚洲影院在线观看| 麻豆精品在线播放| 欧美三级第一页| 青青伊人久久| 人人精品久久| 久久精品av麻豆的观看方式| 亚洲69av| 一区二区电影在线观看| 日韩中文字幕麻豆| 水野朝阳av一区二区三区| 国产免费成人| 视频在线观看一区| 中国女人久久久| 欧洲精品一区二区三区| 在线天堂资源www在线污| 国产69精品久久| 中文字幕在线看片| 日韩精品永久网址| 涩涩av在线| 欧美日韩精品一本二本三本| 好看的av在线不卡观看| 91久久在线| 日韩三级精品|