package com.imooc; import java.io.FileInputStream; import java.io.IOException; public class IOUtil { /** * 读取指定文件内容,按照十六进制输出到控制台 * 每输出是个byte换行 * 下面的printHex()方法演示了如何构造最简单的FileInputStream,如何进行一个简单的读,以及如何读到文件结束 * @param fileName * @throws IOException */ public static void printHex(String fileName) throws IOException{ //1.构造FileInputStream的对象,把文件作为字节流进行读操作 FileInputStream in = new FileInputStream(fileName); int b; int i = 1; while((b = in.read())!= -1){ //如果b小于16进制中的一位,就在前面补0 if(b <= 0xf){ System.out.print("0"); } System.out.print(Integer.toHexString(b & 0xff) + " ");//将整型b转换为16进制表示的字符串 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];//创建一个20K大小的字节 // 从in中批量读取字节,把读到的字节放到buf这个字节数组中,从第0个位置开始放,最多放b.length个字节,返回的是读到的字节的个数 int bytes = in.read(buf,0,buf.length);//一次性读完,说明字节数组足够大 // 上述语句注意事项: // 1.buf可能读不满,有可能这个字节数组足够大,并没有读满 // 2.buf可能不够放,如果打印出来已经到字节数组里,一次性读完 // 3.返回的是读到的字节的个数,因为最多读了buf.length个,,所以要返回读到的字节的个数 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] & 0xff) + " ");//将整型b转换为16进制表示的字符串 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(); } } } 输出结果: 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的结果不同呢?
第二个的单位数补0的if条件有问题:这样写试试?
if((buf[i] & 0xff)<=0xf) {
System.out.print("0");
}
一个是byte一个是int