1. 程式人生 > >怎麼解決輸入流和輸出流編碼問題

怎麼解決輸入流和輸出流編碼問題

Java讀取檔案的方式總體可以分為兩類:按位元組讀取和按字元讀取。按位元組讀取就是採用InputStream.read()方法來讀取位元組,然後儲存到一個byte[]陣列中,最後經常用new String(byte[]);把位元組陣列轉換成String。在最後一步隱藏了一個編碼的細節,new String(byte[]);會使用作業系統預設的字符集來解碼位元組陣列,中文作業系統就是GBK。而我們從輸入流裡讀取的位元組很可能就不是GBK編碼的,因為從輸入流裡讀取的位元組編碼取決於被讀取的檔案自身的編碼。舉個例子:我們在D:盤新建一個名為demo.txt的檔案,寫入我們。,並儲存。此時demo.txt
編碼是ANSI,中文作業系統下就是GBK。此時我們用輸入位元組流讀取該檔案所得到的位元組就是使用GBK方式編碼的位元組。那麼我們最終new String(byte[]);時採用平臺預設的GBK來編碼成String也是沒有問題的(位元組編碼和預設解碼一致)。試想一下,如果在儲存demo.txt檔案時,我們選擇UTF-8編碼,那麼該檔案的編碼就不在是ANSI了,而變成了UTF-8。仍然採用輸入位元組流來讀取,那麼此時讀取的位元組和上一次就不一樣了,這次的位元組是UTF-8編碼的位元組。兩次的位元組顯然不一樣,一個很明顯的區別就是:GBK每個漢字兩個位元組,而UTF-8每個漢字三個位元組。如何我們最後還使用
new String(byte[]);來構造String物件,則會出現亂碼,原因很簡單,因為構造時採用的預設解碼GBK,而我們的位元組是UTF-8位元組。正確的辦法就是使用new String(byte[],”UTF-8”);來構造String物件。此時我們的位元組編碼和構造使用的解碼是一致的,不會出現亂碼問題了。

相關推薦

怎麼解決輸入輸出編碼問題

Java讀取檔案的方式總體可以分為兩類:按位元組讀取和按字元讀取。按位元組讀取就是採用InputStream.read()方法來讀取位元組,然後儲存到一個byte[]陣列中,最後經常用new String(byte[]);把位元組陣列轉換成String。在最後一步隱藏了一個編碼的細節,new String

標準輸入輸出分別是啥,高效字符的方法

數組 readline write link 針對 span 輸入 控制 system 標準輸入流的書System.in,默認是指向鍵盤的,可以接受用戶鍵盤錄入的數據 標準輸出流是System.out,默認指向控制臺,可以將結果打印到控制臺. 高效字符流: readLine

Java:位元組字元輸入輸出

什麼是流 如果想學習Java工程化、高效能及分散式、深入淺出。微服務、Spring,MyBatis,Netty原始碼分析的朋友可以加我的Java高階交流:854630135,群裡有阿里大牛直播講解技術,以及Java大型網際網路技術的視訊免費分享給大家。 流是個抽象的概念,是對輸入輸出裝置的抽象,輸

Java檔案、輸入輸出常用操作

/** * 對檔案輸入流的處理 */ private static void InputStreamOps() { File file = new File("/ho

C++輸入輸出、緩衝區

一、C++輸入流和輸出流 輸入和輸出的概念是相對程式而言的。 鍵盤輸入資料到程式叫標準輸入,程式資料輸出到顯示器叫標準輸出,標準輸入和標準輸出統稱為標準I/O,檔案的輸入和輸出叫檔案I/O。   cout——標準輸出流,全域性流物件,輸出資料到顯示器 cin——標準輸入流,鍵盤

C++輸入輸出、緩沖區

一個 驅動器 掌握 輸入數據 tle 處理 字符串 輸出格式 效率 一、C++輸入流和輸出流 輸入和輸出的概念是相對程序而言的。 鍵盤輸入數據到程序叫標準輸入,程序數據輸出到顯示器叫標準輸出,標準輸入和標準輸出統稱為標準I/O,文件的輸入和輸出叫文件I/O。 co

Java語言基礎36-40--輸入輸出

輸入流和輸出流 輸入、輸出流提供一條通道程式,可以使用這條通道讀取源中的資料或把資料傳送到目的地。 把輸入流的指向稱作源,程式從指向源的輸入流中讀取源中的資料; 而輸出流的指向是資料要去的一個目的地,程式通過向輸出流中寫入資料把資料傳送到目的地。   1. File類 File物件主

[Java開發之路](8)輸入輸出

1. Java流的分類 按流向分: 輸入流: 可以從其中讀入一個位元組序列的物件稱作輸入流。 輸出流: 可以向其中寫入一個位元組序列的物件稱作輸出流。 這些位元組序列的來源地和目的地可以是檔案,而且通常都是檔案,但是也可以是網路連線,甚至是記憶體塊。抽象類Input

列舉常用位元組輸入輸出並說明其特點

FileInputStream 從檔案系統中的某個檔案中獲得輸入位元組。 ByteArrayInputStream 包含一個內部緩衝區,該緩衝區包含從流中讀取的位元組。內部計數器跟蹤 read 方法要提供的下一個位元組。 FilterInputStream 包含其他一些輸

Android中檔案讀寫(輸入輸出)操作總結(附原始碼)

Android中檔案讀寫操作 1. Android中檔案讀寫的原理: (1).所有檔案的儲存都是位元組的儲存。 (2).在磁碟上保留的並不是檔案的字元而是先把字元編碼成位元組,再儲存這些位元組到磁碟。 (3).在讀取檔案(

輸入輸出理解

對於這個問題,你首先要知道“流”的概念,流就像水一樣,源源不斷的傳送,它是一種資料傳輸的模式。根據資料流方向的不同,可分為輸入流和輸出流。 輸入流就是把資料(鍵盤輸入、滑鼠、掃描器等等外設裝置)讀入到記憶體(程式)中,輸出流就是把記憶體(程式)中的資料輸出到外設或其他地方,

C語言:使用命令列引數用字串讀取輸出進行文字檔案的複製

#include<stdio.h> int main(int argc,char *argv[]) {   //檢查使用者的引數是否正確   if(argc<3)   {     printf("用法:命令 原始檔名 目標檔名\n");     return -1;

C++輸入輸出

一 I/O流的概念和流類庫的結構 1 I/O流的概念和流類庫的結構 1)標準裝置的輸入和輸出。即從鍵盤輸入資料,輸出到顯示器螢幕。標準輸入輸出 2)標準裝置的輸入和輸出。即從鍵盤輸入資料,輸出到顯示器螢幕。標準輸入輸出 3)記憶體中指定的空間進行輸入和輸出,稱為字串輸入輸出,簡稱串I

轉換標準輸入輸出

轉換流提供了字元流和位元組流之間的轉換 InputStreamReader和OutputStreamWriter 位元組流中的資料都是字元時,轉成字元流操作更高效 /* 轉換流:inputStreamReader OutputStreamWriter 編碼:字串 --->

輸入輸出__檔案對話方塊 JFileChooser

使用檔案對話方塊 指定輸入輸出檔案 是一個常用功能。 本博文介紹 用檔案對話方塊 開啟和儲存 檔案的方法 使用javax.swing.JFileChooser 實現開啟和儲存檔案對話方塊 一. JFileChooser 類的常用方法 showOpernDialog()  

C++技術點積累(6)——異常處理、輸入輸出

1、異常處理機制: 1、異常是一種程式控制機制,與函式機制獨立和互補 函式是一種以棧結構展開的上下函式銜接的程式控制系統,異常是另一種控制結構,它依附於棧結構,卻可以同時設定多個異常型別作為網捕條件,從而以型別匹配在棧機制中跳躍回饋. 2、異常設計目的: 棧機制是一種高度節

java裡面的輸入輸出、節點處理區別

在java中的流 按流動方向可以分為輸入流及輸出流兩種,輸入流,輸出流是以程式為參考點來說的 輸入流:就是程式從中獲取資料的流,輸入流的一邊是程式,而另一邊就是流的資料來源 輸出流:就是程式要其寫資料的流,輸出流的一邊則目標,一邊就是程式 按流的處理位置可分為節點流和處理流

java 輸入輸出緩衝區的個人學習感悟

2015年國慶以後,很慶幸加入了我們學校的"移動網際網路實驗室",當時加入實驗室只是一個C語言和java語言初學的毛頭小子。2015國慶年至2015年12月完成了小組之間的第一個任務“趣味測試”,現在覺得好low,也是在這一段時間自己接觸了Android開發,初學了一些關於

關於FileInputStreamFileOutputStream輸入輸出問題

輸入流,輸出流到底是怎麼來分辨,在寫程式碼的時候經常會遇到問題,或者經常混淆找兩個流的關係。通過今天的學習做個筆記,也提供給大家來學習,同時提出我的問題。 書上說 輸入流:只能從中讀取資料,不能向其寫入資料。 輸出流:只能向其寫入資料,不能從中讀取資料。

【原創】從原始碼剖析IO(一)輸入輸出--轉載請註明出處

InputStream與OutPutStream兩個抽象類,是所有的流的基礎,首先來看這兩個流的API InputStream: public abstract int read() throws IOException; 從輸入流中讀取資料的下個位元組