为了账号安全,请及时绑定邮箱和手机立即绑定

谁来帮忙看一下我的关于JavaIO字节流的问题

谁来帮忙看一下我的关于JavaIO字节流的问题

aiguo94 2016-04-07 20:38:08
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循环,循环读取会好一点

查看完整回答
反对 回复 2016-04-15
  • aiguo94
    aiguo94
    谢谢你的帮助。 其实我更想问的问题是我的代码是跟着老师打的,javaIO视频里的老师就是这么敲的,为什么我的两个方法结果是不一样的,老师的结果是一样的。难道是因为读取的文件类型的问题。 我基础是真的很不好,一个人自学,实在是太难了。
  • 特南克斯
    特南克斯
    你是对着老师的视频代码完全一样敲的吗?那我就不知道了。你两个方法输出的结果其实是一样的。只不过一个是一个字节8位,一个是4个字节32位,而这个32位的数高位补的是1。如果你对我上面说的不是太明白的话,你应该去了解一下什么是原码,补码,反码和计算机二进制的知识
  • aiguo94
    aiguo94
    恩恩,谢谢你
  • 1 回答
  • 0 关注
  • 1412 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信