问答详情
源自:4-2 字节流之文件输入流FileInputStream-2

为什么两次输出不同?

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

提问者:蔚然成麟er 2017-03-16 21:11

个回答

  • Lx_21
    2018-06-12 08:50:37

    第二个的单位数补0的if条件有问题:这样写试试?

    if((buf[i] & 0xff)<=0xf) {

    System.out.print("0");

    }


  • 给我一杯咖啡
    2017-03-16 23:09:42

    一个是byte一个是int