用io流讀取並輸出時,採用byte陣列讀取固定長度len,為了保證當最後一次讀取位元組數不足len時後面未被覆蓋的位元組對輸出產生影響,一般採用new string(bytes,0,len).getbytes()的方法去擷取位元組陣列的有效長度。
初學io流的時候就是採用如下的**進行複製檔案的
//方法二 基本位元組流 一次乙個位元組陣列(1024)
system.out.
println
("方法二 基本位元組流 一次乙個位元組陣列(1024)");
//封裝資料源
fileinputstream fis =
newfileinputstream
(src)
;//封裝目的地
fileoutputstream fos =
newfileoutputstream
(dest)
;//一次複製乙個位元組陣列
byte
by =
newbyte
[1024];
int len =0;
while
((len = fis.
read
(by))!=
-1)//釋放資源
fos.
close()
; fis.
close()
;
今天做課設的時候發現如此得到的新byte陣列和原來不一致。
於是考慮是不是構造string和getbytes時採用系統預設編碼引發了不一致的問題,遂統一編碼。
依次測了 utf8 、gbk 、unicode 依然還是不一致。
不同編碼還會導致getbytes()不一樣長,問題找到了,應該是採用不同編碼構造string的時候,對原本的位元組進行了不同程度的填充或者截斷,導致了原本的位元組陣列轉成字串並不是乙個位元組轉成乙個字元。
查閱各種編碼對於乙個字元的表示方法:
1、ascii碼中,乙個英文本母(不分大小寫)佔乙個位元組的空間,乙個中文漢字佔兩個位元組的空間。乙個二進位制數字序列,在計算機中作為乙個數字單元,一般為8位二進位制數,換算為十進位制。最小值0,最大值255。
2、utf-8編碼中,乙個英文本元等於乙個位元組,乙個中文(含繁體)等於三個位元組。
3、unicode編碼中,乙個英文等於兩個位元組,乙個中文(含繁體)等於兩個位元組。
符號:英文標點佔乙個位元組,中文標點佔兩個位元組。舉例:英文句號「.」佔1個位元組的大小,中文句號「。」佔2個位元組的大小。
4、gbk編碼方式是中文佔兩個位元組,英文佔1個位元組
發現都不是固定的乙個位元組對應乙個字元,而iso-8859-1就是用乙個位元組儲存乙個字元。
將編碼統一成iso-8859-1後問題就解決了。
這麼麻煩 我為啥不直接for迴圈構造乙個長度為len的新位元組陣列???
改了一下,果然效果和統一為iso-8859-1一樣。。。
費半天勁,以後不用string構造的辦法了!
//一次複製乙個位元組陣列
byte
by =
newbyte
[1024];
int len =0;
while
((len = bis.
read
(by))!=-1)
字串轉byte陣列 字串匹配演算法總覽
字串匹配在文字處理裡非常重要,我們採用簡潔的python 把以下演算法一一實現並講解。樸素演算法 algorithm rabin karp 演算法 有限自動機演算法 finite automation knuth morris pratt 演算法 kmp algorithm boyer moore ...
PHP 陣列轉字串,與字串轉陣列
implode 使用乙個字串將陣列變成字串 array array lastname email phone comma separated implode array 使用 連線 echo comma separated lastname,email,phone empty string when...
PHP 陣列轉字串,與字串轉陣列
php 陣列轉字串,與字串轉陣列 implode 使用乙個字串將陣列變成字串 array array lastname email phone comma separated implode array echo comma separated lastname,email,phone empty ...