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的结果不同呢?