package lianxi;
import java.io.FileInputStream;
import java.io.IOException;
public class IOUtil {
/**
* 读取指定文件内容,按照16进制输出到控制台
* 并且每输出十个byte换行
* @param fileName
*/
public static void printHex(String fileName) throws IOException{
//把文件作为字节流进行读操作
FileInputStream in=new FileInputStream(fileName);
int b;
int i=1;
while((b=in.read())!=-1){
if(b<=0xf){
//单 位数前面补0
System.out.print("0");
}
System.out.print(Integer.toHexString(b)+" ");//将整型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];
/**
* 从in中批量读取字节,放入到buf这个字节数组中,从第0个位置开始放,
* 最多放buf.length个。返回的是读到的字节的个数
*/
int bytes=in.read(buf,0,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])+" ");
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类的第二个方法的测试类第一个测试类能成功运行,第二个测试类就不行了,不知道哪里出问题了,求教大神解答。先谢谢了
1 回答
已采纳
特南克斯
TA贡献14条经验 获得超9个赞
问题其实很简单,你的第二个测试类的错误是因为你基础不好,只不过是有两个毛病,我给你解释一下。
第一个:
System.out.print(Integer.toHexString(b)+" ");//将整型b转换为16进制表示的字符串
这里的toHexString方法是吧整数转换成十六进制的String,在你的第一个方法中,你read方法将文件中的一个数据字节读取成Int返回,一个字节8位,一个int32位,在转换成16进制的string输出的是2位的16进制。
在你的第二个方法中,
System.out.print(Integer.toHexString(buf[i])+" ");
这里的buf[i]是字节8位,8为转换为int32位,转换为hexString是8位的16进制,所以你看起来是输出错误了,下面是错误的解决方法:
System.out.print(Integer.toHexString(buf[i]&0x000000ff) +" ");
加上一个位运算,把高位数据擦除就可以了。
第二个:
byte缓冲区不要太大,打印那么多零,你不难受?但是也别太小了,加上一个while循环,循环读取会好一点
添加回答
举报
0/150
提交
取消