• 20155322 《Java程序设计》课堂实践项目MyOD


    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
    
    

    最后实现效果如图(图一为第一次的效果,图二为修改后的效果):

    链接

  • 相关阅读:
    leetcode------Remove Element
    leetcode------Merge Two Sorted Lists
    [转载]Unity3D 游戏引擎之使用C#语言建立本地数据库(SQLITE)
    [转载]VS2012创建MVC3项目提示错误: 此模板尝试加载组件程序集 “NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”。
    [转载]Unity3D 访问Access数据库
    [转载]C#导入XLS数据到数据库
    [转载]Unity3D的断点调试功能
    [Unity3D]支持的视频格式
    unity 3d 获取鼠标当前坐标
    [转载]VS2012程序打包部署详解
  • 原文地址:https://www.cnblogs.com/blackay03/p/6923244.html
Copyright © 2020-2023  润新知