20155322 《Java程序设计》课堂实践项目MyOD
实践要求
-
编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能
-
提交测试代码和运行结果截图,加上学号水印,提交码云代码链接。
实践内容
通过对课本305页和306页两个代码的理解,我写出了实现老师要求的代码
老师要求要和Linux下od -tx -tc XXX的功能的输出格式一模一样,于是我修改了我的代码:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* Created by mac on 2017/5/31.
*/
public class MyOD {
public static void main(String[] args) throws IOException {
MyOD.dump(
new FileInputStream(args[0])
);
}
public static void dump(InputStream src)
throws IOException {
try (InputStream input = src) {
byte[] buf = new byte[50];
int k = input.read(buf, 0, buf.length); //读取100byte
//System.out.println(new String(buf)); 将这100byte打印出来,测试
int[] in = new int[buf.length]; //新建数组,储存其ASCII码值
for (int i = 0; i < in.length; i++) { //将byte的8位于1111_1111与
in[i] = buf[i]&0xff; //得到ASCII码值
}
int flat = 0,temp = 0,j = 0; //状态控制变量flag,循环控制变量temp,j
do {
if(flat == 0) {
while(temp < buf.length) {
if(buf[temp] != 0 ) { //如果有数据则打印
System.out.printf("%c ",buf[temp]);
temp++;
if(temp%16 == 0 && temp!=0){ //如果打印了16个就换行,flat置1
System.out.println(); //换行,并跳出循环,进行ASCII数组的输出
flat = 1;
break;
}
}
else {
flat = 3; //遍历完毕,flat置3,跳出do-while循环
j++;
}
}
}
else if(flat == 1) {
while(j < in.length) {
if(in[j]!=0) {
System.out.printf(Integer.toString(in[j], 0x10));
System.out.printf(" ");
j++;
if(j%16 == 0 && j!=0) { //如果打印了16个就换行,flat置0
System.out.println(); //换行,跳出循环,换到byte输出
flat = 0;
break;
}
}
else {
flat = 3; //遍历完毕,flat置3,跳出do-while循环
j++;
}
}
}
else System.out.println("wrong!");
if(flat == 3) break; //flat为3,跳出do-while循环
}while(flat == 0 || flat == 1);
}
System.out.println();
}
}
运行之后出现了这样的问题:
- 我发现问题出现的原因是因为下面这个
else
没有进行break
跳出,导致一直在flag=0
状态中死循环,程序无法结束。
else {
flat = 3; //遍历完毕,flat置3,跳出do-while循环
j++;
- 于是我进行了修改,将
flat
置1,使程序跳出循环后进入flat=1
中进行ASCII码的输出,然后结束程序。
else {
System.out.println(); //buf[]遍历结束就转到ASCII把剩下的输出了
flat = 1;
break;
}
- 修改了代码并完善了注释后的程序完整代码:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* Created by mac on 2017/5/31.
*/
public class MyOD {
public static void main(String[] args) throws IOException {
MyOD.dump(
new FileInputStream(args[0])
);
}
public static void dump(InputStream src)
throws IOException {
try (InputStream input = src) {
byte[] buf = new byte[50];
int k = input.read(buf, 0, buf.length); //读取100byte
//System.out.println(new String(buf)); 将这100byte打印出来,测试
int[] in = new int[buf.length]; //新建数组,储存其ASCII码值
for (int i = 0; i < in.length; i++) { //将byte的8位于1111_1111与
in[i] = buf[i]&0xff; //得到ASCII码值
}
int flat = 0,temp = 0,j = 0; //状态控制变量flag,循环控制变量temp,j
do {
if(flat == 0) {
while(temp < buf.length) {
if(buf[temp] != 0 && buf[temp] != 10) { //如果有数据,并且不是换行则打印
System.out.printf("%c ",buf[temp]);
temp++;
if(temp%16 == 0 && temp!=0){ //如果打印了16个就换行,flat置1,换到ASCII输出
System.out.println();
flat = 1;
break;
}
}
else {
System.out.println(); //buf[]遍历结束就转到ASCII把剩下的输出了
flat = 1;
break;
}
}
}
else if(flat == 1) {
while(j < in.length) {
if(in[j]!=0 && in[j] != 10) { //如果有数据,并且不是换行则打印
System.out.printf(Integer.toString(in[j], 0x10));
System.out.printf(" ");
j++;
if(j%16 == 0 && j!=0) { //如果打印了16个就换行,flat置0,换到BYTE输出
System.out.println();
flat = 0;
break;
}
}
else {
flat = 3; //所有的数据输出完毕,flat置3,跳出大循环,结束程序
break;
}
}
}
else System.out.println("wrong!");
if(flat == 3) break;
}while(flat == 0 || flat == 1); //只要flat不为3,继续循环
}
}
}
- 我使用的输入文本内容为:
abcdeafjkdhoahgweuiiughwjndknagjhgfuqiut
最后实现效果如图(图一为第一次的效果,图二为修改后的效果):