《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之前

六、代码托管

七、参考资料

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

原文地址:https://www.cnblogs.com/wangzihong0213/p/10776364.html

时间: 2024-10-13 11:06:10

《Linux下cp XXX1 XXX2的功能》的实现的相关文章

编程实现类似Linux下cp功能

MyCP的代码实现 一.题目要求: 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bin 用来把文本文件(内容为十进制数字)转化为二进制文件 java MyCP -xt XXX1.bin XXX2.txt 用来二进制文件把转化为文本文件(内容为十进制数字) 二.设计思路 此次的代码要求实现类似Linux下cp的功能.我们需要注意的以及考虑的细节有以下几点: 源文件和目标文件分属不同的

linux下Python tab补全功能代码

1.在学习linux的童鞋都用惯了tab补全功能,从而在学习Python的同时,一是为了方便,二是可以看到更多的关于Python命令下的知识. 2.配置步骤: (1) 在linux下键入这样的代码: vim tab.py #!/usr/bin/python # python tab file import sys import readline import rlcompleter import atexit import os #tab completion readline.parse_an

Linux下cp和scp的详细说明及其他们的区别

一.说明 cp:是在同一个linux系统上,在不同的目录之间复制文件: scp:是在不同linux系统之间来回复制文件: 二.cp 用法 单个文件复制: cp   源文件   目标路径  ~~从原路径复制源文件到目标路径下:如果在目标路劲之后加文件名称和格式意思就是复制过去之后将该文件重命名. 多个文件复制: cp   源文件1  源文件2 源文件3 ...   目标路径  ~~从原路径复制源文件到目标路径下: 三.cp 的参数详解 -a 尽可能将源文件状态.权限等资料都照原装予以复制,并且是递

Linux下cp -rf总是提示覆盖的解决办法

通常情况下使用cp -rf进行文件或者文件夹的管理时一般就不再提醒是否覆盖.然而在内网的一台机器上使用cp -rf却提示是否覆盖.难道和常用的命令不同? [[email protected] test]# cp -rf ./files/ ./bak/ cp:是否覆盖"./bak/files/test.txt"? cp:是否覆盖"./bak/files/hh.txt"? cp:是否覆盖".www.1.qixoo.com/bak/files/child/chi

(转)linux下cp目录时排除一个或者多个目录的实现方法

原文链接:http://www.jb51.net/LINUXjishu/88971.html 说明:/home目录里面有data目录,data目录里面有a.b.c.d.e五个目录,现在要把data目录里面除过e目录之外的所有目录拷贝到/bak目录中 方法一:终端命令行下执行以下命令 cp -R `find /home/data -type d -path /home/data/e -prune -o -print | sed 1d ` /bak##########################

linux下cp目录时排除一个或者多个目录的方法

说明:/home目录里面有data目录,data目录里面有a.b.c.d.e五个目录,现在要把data目录里面除过e目录之外的所有目录拷贝到/bak目录中 系统运维 www.osyunwei.com 温馨提醒:qihang01原创内容版权所有,转载请注明出处及原文链接 方法一:终端命令行下执行以下命令 cp -R `find /home/data -type d -path /home/data/e -prune -o -print | sed 1d ` /bak ###############

Linux下cp ~中关于“~”的疑问

目的:将wi主文件夹下的.bashrc复制到/tmp,并更名为bashrc.对于书上的代码上加"~"存在疑问. cp ~/.bashrc /tmp/bashrc 对命令进行了以下尝试: 为什么不加"~"会出错,查书发现,"~"代表"目前用户身份"所在的主文件夹,不加"~"是带便根目录,通过在ls -al查询根目录 发现没有.bashrc存在,所以报错. 该文件是存在于目前用户的主文件内,当加"~&

linux下/proc/sysrq-trigger文件的功能

/proc/sysrq-trigger该文件能做些什么事情呢? # 立即重新启动计算机 (Reboots the kernel without first unmounting file systems or syncing disks attached to the system)echo "b" > /proc/sysrq-trigger # 立即关闭计算机(shuts off the system)echo "o" > /proc/sysrq-tr

Linux下安装zlib-实现压缩功能

zlib 程序库是著名的压缩引擎,zlib 也是著名的 gzip (GNU zip) 所采用的压缩引擎. 如何安装zlib库? 一. 首先安装zlib,从其官方网站下载最新的源程序,网址:http://www.gzip.org/zlib/. 在然后将下载的文件解压释放到目录.解压后文件夹中自带了合适的makefile: 当使用make命令进行编译时,会要求先运行同一目录中的configure文件. 打开configure文件我们可以发现是Shell Script,所以运行sudo sh conf