Java Inputstream讀取檔案亂碼問題__大資料

來源:互聯網
上載者:User

新人才開始學習寫部落格,不喜勿噴。歡迎各位大佬批評指正,感激不敬。

我之前做了10個月C#,後來轉Java 自學也有一段時間,有物件導向基礎學起基礎還是挺快的。今天突然突發奇想,想來操作下Java檔案讀取(不得不說以前自己都很懶,能百度的東西自己都不願意自己親手去做,希望廣大碼友不要學我,凡事自己多實踐)這篇文章主要記錄自己在使用Inputstream遇到問題(亂碼和位元組)廢話不多說直接上代碼

class ReadFile {
public String readfilebyInputStream(String filePath){
String result="";
File file=new File(filePath);
InputStream inputstream=null;
byte []b=new byte[1024];//接受1024個位元組
try {
inputstream=new FileInputStream(file);
int temp;
int length=0;
while((temp=inputstream.read())!=-1) {//每次讀取一個位元組,存放在byte數組中
b[length]=(byte)temp;
length++;
}
return new String(b,0,length);//將位元組轉換成String 
}
catch(Exception e) {
e.printStackTrace();
return e.getMessage();
}
finally {
if(inputstream!=null) {
try {
inputstream.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}
}

}

代碼調用:

public static ReadFile filetool=new ReadFile();
public static void main(String[] args) {
System.out.println( filetool.readfilebyInputStream("d:/FileTest/test.txt"));
}

輸出內容:

ljflsjafl
asfjliruqwdkaopsj
�ʹ�ʱ�䷢
akdlasjflnf������flaw Iowa��2
42żpsdaksfasjsffas

程式碼分析:

出現亂碼,這是因為 我們自己電腦上的文檔預設的GBK格式,而我的.java檔案被我預設成utf-8檔案,所以出現中文亂碼,

return new String(b,0,length)更改為return new String(b,0,length,"GBK")指定編碼格式中文完整輸出。如下:

ljflsjafl
asfjliruqwdkaopsj
送達時間發
akdlasjflnf發酵素flaw Iowa人2

42偶psdaksfasjsffas

但是還有一種情況也可能會出現亂碼 比如我把代碼改成如下樣子,我把byte數組設定小一點比如11個位元組,然後迴圈利用者這11個位元組數組去接受讀取的資料,每次讀滿11個位元組就轉換成String類型;代碼如下

class ReadFile {
public String readfilebyInputStream(String filePath){
String result="";
File file=new File(filePath);
InputStream inputstream=null;
byte []b=new byte[11];//位元組數組大小
try {
inputstream=new FileInputStream(file);
int temp;
int length=0;
while((temp=inputstream.read())!=-1) {//每次讀取一個位元組,存放在byte數組中
//每次讀取11個位元組,並轉換成String
if(length==11) {
result+=new String(b,0,length,"GBK");
length=0;
}
b[length]=(byte)temp;
length++;
}
return result+=new String(b,0,length,"GBK");//退出迴圈的時候,最後一個位元組數組可能並沒有11個位元組
}
catch(Exception e) {
e.printStackTrace();
return e.getMessage();
}
finally {
if(inputstream!=null) {
try {
inputstream.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}
}

}

這個時候輸出內容:ljflsjafl
asfjliruqwdkaopsj
送�鍤奔浞�
akdlasjflnf發酵素flaw Iowa人2

42偶psdaksfasjsffas

結論:

依然出現了亂碼,這是因為我們中文佔用兩個位元組,比如這樣一個常值內容"abcdefghjk胡"前面是10字母,第十一位是中文,其實這個文本佔用了12個位元組,表面上看佔用11個位元組而已,最後一個中文"胡"會被分解成兩個位元組,當我用11個位元組去取這個文本的時候,唯讀取了前面10個字母+一個中文的位元組,然後用new String(b,0,length,"GBK")轉中文的時候自然就亂碼。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.