20155228 2017-5-31 课堂测试:编写MyOD.java
题目和要求
编写MyOD.java:用java MyOD XXX实现Linux下od -tx -tc XXX的功能
提交测试代码和运行结果截图,加上学号水印,提交码云代码链接。
分析和设计
import java.io.*;/** * Created by besti20155228 on 17-5-31. */public class code053102 { public static void main(String[] args) throws IOException { FileReader reader = new FileReader(args[0]);//新建FileReader实例,将args[0]的内容作为源文件实例 StringWriter writer = new StringWriter();//新建StringWriter实例 code053103.dump(reader, writer);//调用dump方法进行处理 }}class code053103 { public static void dump(Reader src, Writer dest) throws IOException { try (Reader input = src; Writer output = dest)//检查地址是否正确 { char[] data = new char[1024];//定义一个字符数组用来装读取到的内容 int[] number = new int[1024];//定义一个数组用来装读取的内容的ascii码 int length; int n; String temp=new String();//定义一个字符串用来装读取到的内容的ascii码的16进制形式数 String string=new String(); while ((length = input.read(data)) != -1)//成功读取到字符 { output.write(data, 0, length);//将源文件内容放到目的文件中 } for (n = 0; n < 1024; n++) { if (data[n] != 0) { System.out.print(data[n]);//打印读取到的字符 if ((n + 1) % 32 == 0)//每隔16个字符打印一个空格,源文件中的空格也算一个字符,所以是32个 System.out.println(); } } for (n = 0; n < 1024; n++) { number[n] = (int) data[n];//将读取的字符转换为ascii码 temp=Integer.toHexString(number[n]);//将ascii码换成16进制数 string=string+" "+temp;//把16进制的ascii码放到string中 if (number[n] != 0) { if (number[n] != 32 && number[n]!=10)//不打印空格的ascii码,也不打印不到1024位的部分 { System.out.print(number[n]); System.out.print(" "); } if ((n + 1) % 32 == 0)//每隔16个字符打印一个空格,源文件中的空格也算一个字符,所以是32个 System.out.println(); } } System.out.println(string);//打印16进制的ascii码 } }}
问题和解决
- 本来是想直接教材第十章开头的代码的思路,以byte为单位读入文件内容的。但是后来想起一个字符是2个byte,如果按btye的格式读入的话就把字符的编码给拆开了,所以最后用了FileReader和StringWriter以字符为单位读入。
- 将字符转换成ascii码:通过查阅教材发现
FileReader
读入字符实际上就是读入ascii码值,所以强制类型转换就可以了
number[n] = (int) data[n];
- 根据要求每16个字符进行1次换行,但是if语句设为
(n + 1) % 16 == 0)
的时候发现每隔8个字符就换行了,后来仔细思考想到空格也要算一个字符!所以代码应该改为:
if ((n + 1) % 32 == 0)//每隔16个字符打印一个空格,源文件中的空格也算一个字符,所以是32个 System.out.println();
- 将10进制ascii码转换成16进制ascii码可以直接调用
Integer.toHexString
方法:
temp=Integer.toHexString(number[n]);//将ascii码换成16进制数string=string+" "+temp;//把16进制的ascii码放到string中
代码和结果
- 运行截图