新人才開始學習寫部落格,不喜勿噴。歡迎各位大佬批評指正,感激不敬。
我之前做了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")轉中文的時候自然就亂碼。