package?com.imooc;
import?java.io.FileInputStream;
import?java.io.IOException;
public?class?IOUtil?{
?/**
??*?讀取指定文件內(nèi)容,按照十六進(jìn)制輸出到控制臺
??*?每輸出是個byte換行
??*?下面的printHex()方法演示了如何構(gòu)造最簡單的FileInputStream,如何進(jìn)行一個簡單的讀,以及如何讀到文件結(jié)束
??*?@param?fileName
??*?@throws?IOException?
??*/
?public?static?void?printHex(String?fileName)?throws?IOException{
??//1.構(gòu)造FileInputStream的對象,把文件作為字節(jié)流進(jìn)行讀操作
??FileInputStream?in?=?new?FileInputStream(fileName);
??int?b;
??int?i?=?1;
??while((b?=?in.read())!=?-1){
???//如果b小于16進(jìn)制中的一位,就在前面補0
???if(b?<=?0xf){
????System.out.print("0");
???}
???System.out.print(Integer.toHexString(b?&?0xff)?+?"??");//將整型b轉(zhuǎn)換為16進(jìn)制表示的字符串
???if(i++?%?10?==?0){
????System.out.println();
???}
??}
??in.close();
?}
?/**
??*?把一個文件以字節(jié)的方式讀出來,把字節(jié)以十六進(jìn)制的方式打印到控制臺
??*/
?public?static?void?printHexByByteArray(String?fileName)?throws?IOException{
??FileInputStream?in?=?new?FileInputStream(fileName);
??byte[]?buf?=?new?byte[20*1024];//創(chuàng)建一個20K大小的字節(jié)
//??從in中批量讀取字節(jié),把讀到的字節(jié)放到buf這個字節(jié)數(shù)組中,從第0個位置開始放,最多放b.length個字節(jié),返回的是讀到的字節(jié)的個數(shù)
??int?bytes?=?in.read(buf,0,buf.length);//一次性讀完,說明字節(jié)數(shù)組足夠大
//??上述語句注意事項:
//??1.buf可能讀不滿,有可能這個字節(jié)數(shù)組足夠大,并沒有讀滿
//??2.buf可能不夠放,如果打印出來已經(jīng)到字節(jié)數(shù)組里,一次性讀完
//??3.返回的是讀到的字節(jié)的個數(shù),因為最多讀了buf.length個,,所以要返回讀到的字節(jié)的個數(shù)
??int?j?=?1;//用來計數(shù)
??for(int?i?=?0;i?<?bytes;i++){
???if(buf[i]?<=?0xf){
????System.out.print("0");
???}
???System.out.print(Integer.toHexString(buf[i]?&?0xff)?+?"??");//將整型b轉(zhuǎn)換為16進(jìn)制表示的字符串
???if(j++?%?10?==?0){
????System.out.println();
???}
??}
??in.close();
??
//??FileInputStream?in?=?new?FileInputStream(fileName);
//??byte[]?buf?=?new?byte[20*1024];
//??int?bytes?=?0;
//??int?j?=?1;
//??while((bytes?=?in.read(buf,0,buf.length))?!=?-1){
//???for(int?i?=?0;i?<?bytes;i++){
//????if(buf[i]?<=?0xf){
//?????System.out.print("0");
//????}
//????System.out.print(Integer.toHexString(buf[i]?&?0xff)?+?"?");
//????if(j++?%?10?==?0){
//?????System.out.println();
//????}
//???}
//??}
?}
?public?static?void?main(String[]?args)?throws?IOException{
??try?{
???IOUtil.printHex("demo\\Raf.dat");
??}?catch?(Exception?e)?{
???//?TODO?Auto-generated?catch?block
???e.printStackTrace();
??}
??
??System.out.println("\n.......................................\n");
??
??try?{
???IOUtil.printHexByByteArray("demo\\Raf.dat");
??}?catch?(Exception?e)?{
???//?TODO?Auto-generated?catch?block
???e.printStackTrace();
??}
?}?
}
輸出結(jié)果:
41??42??7f??ff??ff??ff??7f??ff??ff??ff??
d6??d0??ad??
.......................................
41??42??7f??0ff??0ff??0ff??7f??0ff??0ff??0ff??
0d6??0d0??0ad?
為什么第一個printHex()和第二個printHexByByteAwway()判斷是否小于等于0xf的結(jié)果不同呢?
2018-06-12
第二個的單位數(shù)補0的if條件有問題:這樣寫試試?
if((buf[i] & 0xff)<=0xf) {
System.out.print("0");
}
2017-03-16
一個是byte一個是int