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

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类的第二个方法的测试类



第一个测试类能成功运行,第二个测试类就不行了,不知道哪里出问题了,求教大神解答。先谢谢了

aiguo94
浏览 1446回答 1
1回答

特南克斯

问题其实很简单,你的第二个测试类的错误是因为你基础不好,只不过是有两个毛病,我给你解释一下。第一个: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循环,循环读取会好一点
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java