《Linux下cp XXX1 XXX2的功能》的实现

Posted wangzihong0213

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Linux下cp XXX1 XXX2的功能》的实现相关的知识,希望对你有一定的参考价值。

《Linux下cp XXX1 XXX2的功能》的实现

一、题目要求

编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数:

  • java MyCP -tx XXX1.txt XXX2.bin 用来把文本文件(内容为十进制数字)转化为二进制文件
  • java MyCP -xt XXX1.bin XXX2.txt 用来二进制文件把转化为文本文件(内容为十进制数字)

二、设计思路

题目要求通过命令行输入的方式输入要读入的文件和要写入的文件并能够完成十进制和二进制相互转化的功能,在完成题目前我思考了如下几个问题:

1、如何完成十进制和二进制之间的转换?
  • 十进制转化为二进制非常容易,如果不知道简单方法或命令我们可以通过最原始的方法——将十进制数模2取余数,将得到的二进制结果用字符串格式输出即可。这里需要注意的是的得到的二进制表示也就是模2的结果一定要逆序排列,否则得到的结果和十进制是不符的(开始写代码的时候忽略了这个问题)
  • 二进制数如何转化为十进制数呢?最初的想法是将字符串存放在字符数组中,对数组进行遍历,通过数组下标和数组中存放的内容与2进行指数运算得到十进制数。但最后放弃了这个想法,这样运算起来实在是过于麻烦,并且因为二进制文件中的内容(即二进制数字的位数)不确定,因此数组空间的大小也无法确定。在查找资料中发现在可以通过Integer.parseInt 方法实现这一目的
    技术图片
2、如何完成从指定格式文件内容运算后写入到另一文件中?
  • 在还没有开始写代码前思考过这个问题,按照书上第十章的内容,都是在创建文件时就给出了文件的名字,例如File f = new File("hello.txt") 但本题要求是从命令行输入文件的名字,并且可以进行不同功能的进制转换,因此在程序中就不可能规定具体的文件名,那么应该如何确定文件名呢?
  • 首先按照题目的要求分别在src目录下建立了wangzihong.txtwangzihong.bin 文件,通过之前的学习我们已经知道主类中main方法的参数args[]是可以储存从命令行中传入的参数的,因此我们可以把从命令行输入的文件名当做是字符类型的变量,在建立文件时以字符串的名字建立,这样就可以控制从命令行传入文件的名字了
3、选择什么流读取文件

书上第十章中介绍了很多读取文件的流,内容比较多,涉及到的方法比较广泛但用起来的同时也比较容易懵,开始时并不知道具体应该使用哪种方法,在思考十进制和二进制转换时有想过用字符数组的方法,因此选择了字符数组输入输出流,同时选择了缓冲流因为缓冲流的源和目的地分别是字符输入和输出流

4、如何控制是十进制转化为二进制还是二进制转化为十进制

这个问题相对就比较简单了,因为控制命令是在命令行输入的,并且只有-tx-xt两种,因此只需要在程序中调用equals方法进行比较即可

三、代码实现

伪代码
命令行读入三个参数:第一个ch代表转化的格式,第二个s1代表要读取的源文件,第三个s2代表要写入的目标文件
参数为“-tx”从txt文件中读取十进制数,转化为二进制后写入bin文件中 
参数为“-xt”从bin文件中读取二进制数,转化为十进制后写入txt文件中
产品代码
import java.io.*;
public class MyCP {??? 
    public static void main(String[] args) {??????? 
        String ch = args[0];??????? 
        String s1 = args[1];??????? 
        String s2 = args[2];??????? 
        File fromfile = new File(s1);??????? 
        File tofile = new File(s2);??????? 
        String result = "";??????? 
        try {??????????? 
            FileReader in = new FileReader(fromfile);??????????? 
            BufferedReader infile = new BufferedReader(in);???????????
            FileWriter out = new FileWriter(tofile);??????????? 
            BufferedWriter outfile = new BufferedWriter(out);??????????? 
            String number = infile.readLine();??????????? 
            if(ch.equals("-tx")) {???????????????
                int n;??????????????? 
                int number1 = Integer.parseInt(number);???????????????
                for(int i=number1;i>0;i=i/2) {??????????????????? 
                    if(i%2==0)??????????????????????? 
                        n = 0;??????????????????? 
                    else???????????????????????
                        n = 1;??????????????????? 
                    result = n + result;??????????????? 
                }??????????? 
            }???????????
            else if(ch.equals("-xt")) {???????????????
                int number1 = Integer.parseInt(number,2);??????????????? 
                result = String.valueOf(number1);??????????? 
            }??????????? 
            outfile.write(result);???????????
            outfile.flush();??????????? 
            outfile.close();??????????? 
            out.close();??????? 
        }??????? 
        catch(IOException e) {??????????? 
            System.out.println("Error"+e);??????? 
        }??? 
    }
}

四、运行结果截图

技术图片

技术图片

技术图片

技术图片

五、遇到的问题

  • 问题1:在用文件创建对象时出现了错误信息
    技术图片
  • 解决办法:查看了教材上有关字符数组输入输出流和缓冲流发现没有使用try-catch抛出可能出现的错误信息
  • 问题2:在将十进制得到的二进制数据转换回去后发现数字和原来不一样
    技术图片
  • 解决方法:在检查代码后发现二进制的运算结果需要从后之前保留,应该将每次得到的n放在字符串result之前

六、代码托管

七、参考资料

如何将二进制转化为十进制

以上是关于《Linux下cp XXX1 XXX2的功能》的实现的主要内容,如果未能解决你的问题,请参考以下文章

编程实现类似Linux下cp功能

elif

课后选做题:MyCP

linux ls正则表达式

拓扑排序

MySQL语句相关