package?lianxi;
import?java.io.FileInputStream;
import?java.io.IOException;
public?class?IOUtil?{
/**
?*?讀取指定文件內(nèi)容,按照16進(jìn)制輸出到控制臺
?*?并且每輸出十個byte換行
?*?@param?fileName
?*/
public?static?void?printHex(String?fileName)?throws?IOException{
//把文件作為字節(jié)流進(jìn)行讀操作
FileInputStream?in=new?FileInputStream(fileName);
int?b;
int?i=1;
while((b=in.read())!=-1){
if(b<=0xf){
//單?位數(shù)前面補(bǔ)0
System.out.print("0");
}
System.out.print(Integer.toHexString(b)+"??");//將整型b轉(zhuǎn)換為16進(jìn)制表示的字符串
if(i++%10==0){
System.out.println();
}
}
in.close();
}
public?static?void?printHexByByteArray(String?fileName)?throws?IOException{
FileInputStream?in=new?FileInputStream(fileName);
byte[]?buf=new?byte[20*1024];
/**
?*?從in中批量讀取字節(jié),放入到buf這個字節(jié)數(shù)組中,從第0個位置開始放,
?*?最多放buf.length個。返回的是讀到的字節(jié)的個數(shù)
?*/
int?bytes=in.read(buf,0,buf.length);//一次性讀完,說明這個字節(jié)數(shù)組足夠大
int?j=1;
for(int?i=0;i<bytes;i++){
if(buf[i]<=0xf){
System.out.print("0");
}
System.out.print(Integer.toHexString(buf[i])+"??");
if(j++%10==0){
System.out.println();
}
}
in.close();
}
}------》這個是IOUtil類package?lianxi;
import?java.io.IOException;
public?class?IOUtilTest1?{
public?static?void?main(String[]?args)?{
try?{
IOUtil.printHex("e:\\wordstudy\\hello.txt");
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
}-----》這個是IOUtilTest1類,是測試IOUtil類的第一個方法的測試類package?lianxi;
import?java.io.IOException;
public?class?IOUtilTest2?{
public?static?void?main(String[]?args)?{
try?{
IOUtil.printHexByByteArray("e:\\wordstudy\\hello.txt");
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
}----》這個是IOUtilTest2類,是測試IOUtil類的第二個方法的測試類第一個測試類能成功運(yùn)行,第二個測試類就不行了,不知道哪里出問題了,求教大神解答。先謝謝了
1 回答
已采納

特南克斯
TA貢獻(xiàn)14條經(jīng)驗(yàn) 獲得超9個贊
問題其實(shí)很簡單,你的第二個測試類的錯誤是因?yàn)槟慊A(chǔ)不好,只不過是有兩個毛病,我給你解釋一下。
第一個:
System.out.print(Integer.toHexString(b)+"??");//將整型b轉(zhuǎn)換為16進(jìn)制表示的字符串
這里的toHexString方法是吧整數(shù)轉(zhuǎn)換成十六進(jìn)制的String,在你的第一個方法中,你read方法將文件中的一個數(shù)據(jù)字節(jié)讀取成Int返回,一個字節(jié)8位,一個int32位,在轉(zhuǎn)換成16進(jìn)制的string輸出的是2位的16進(jìn)制。
在你的第二個方法中,
System.out.print(Integer.toHexString(buf[i])+"??");
這里的buf[i]是字節(jié)8位,8為轉(zhuǎn)換為int32位,轉(zhuǎn)換為hexString是8位的16進(jìn)制,所以你看起來是輸出錯誤了,下面是錯誤的解決方法:
System.out.print(Integer.toHexString(buf[i]&0x000000ff)?+"??");
加上一個位運(yùn)算,把高位數(shù)據(jù)擦除就可以了。
第二個:
byte緩沖區(qū)不要太大,打印那么多零,你不難受?但是也別太小了,加上一個while循環(huán),循環(huán)讀取會好一點(diǎn)
添加回答
舉報(bào)
0/150
提交
取消