MyCP

一、设计思路

确定MyCP的要求

根据需求可知MyCP需要实现类似Linux下cp XXX1 XXX2的功能,且需要支持两个参数:

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

    由需求可知我们需要从命令行获取判断转换方式的参数以及转换文件的文件名,并在MyCP内按-tx和-xt参数的区别分两种情况对文件进行操作。

(一)将命令行中的参数传入MyCP

使用args[]数组将命令行中输入的参数-tx-xt以及文件名记录下来,注意args[0]中的参数是-tx

(二)定义输入输出流,对文件进行操作

在MyCP中我使用了缓冲输入流,因此在文件输入时需要每行输入一个数据。在创建字符输入输出流对象后再建立缓冲输入输出流对象,通过使用redaLine()方法以及write()以及newLine()方法对文件进行读写操作。需要注意的是,输入输出流一定要在try-catch语句中运行,并且在对输入输出文件进行操作后一定要关闭输入输出流对象,并且要先关闭缓冲流再关闭字节流。相关代码如下:

Reader fis   = new FileReader(file);//输入输出流
BufferedReader inData = new BufferedReader(fis);
Writer fos = new FileWriter(file2);
BufferedWriteroutData=new BufferedWriter(fos);
inData.close();//关闭输入输出流的顺序
fis.close();
outData.close();
fos.close();

(三)根据-tx-xt参数的不同分别进行相应进制的转换

使用if-else语句对两种情况进行区分,并分别进行十进制转二进制和二进制转十进制。十进制转二进制使用Integer类的toBinaray(int i)方法获得i的二进制形式的字符串,二进制转十进制使用Integer类的parseInt(String s,int radix)方法,获得数据的十进制int型数。为了便于输出,我将转化完成的数据都用字符串形式记录并输出。相关代码如下:

 while(( str=inData.readLine())!=null){//从文件中读出数据
System.out.println(args[1]+"的第"+i+"个数字"+str);
b=Integer.parseInt((String)(str.trim()));//将字符串转化为int型数
temp=Integer.toBinaryString(b);//转化为二进制字符串
System.out.println(args[2]+"的第"+i+"个数字"+temp);
outData.write(temp);//写入目标文件
outData.newLine();
} while(( str=inData.readLine())!=null){//转化为十进制
System.out.println(args[1]+"的第"+i+"个数字"+str);
b=Integer.parseInt(str.trim(),2);
temp=String.valueOf(b);
System.out.println(args[2]+"的第"+i+"个数字"+temp);
i++;
outData.write(temp);
outData.newLine();
}

二、测试代码

由于需要使用命令行传入参数,因此没有使用junit对代码进行测试,运行结果及遇到的相关问题请见后面部分。

三、运行结果



四、码云代码

链接

五、遇到的问题

在使用数据流对文件进行操作时遇到较多问题,但在更改为缓冲流后问题减少了很多。

  • 问题1:使用write()方法写文件时出现乱码。
  • 问题1解决方法:查看读入的文件,发现是因为输入没有控制在每行一个。
  • 问题2:在使用数据流从文件读入数据并进行转换时出现java.lang.NumberFormatException 错误。
  • 问题2解决方法:找到相应的进行转化的代码,发现是文件读入数据错误,该错误的详细解决方法请见参考资料。

六、感想与思考

本次选做需要实现的MyCP类看起来并不是很难实现,解决的思路也比较明确,但在实际操作中遇到了很多的问题。我原本使用的是数据流,但是在将文件中的数据读入时出现了乱码,但如果将读入的数据直接写入另一文件,文件中却是正确的数据,于是我换成了缓冲流进行输入输出。而在编译运行程序时的数据类型进行转换总是报错,由此可见泛型类还是很重要的。

参考资料

MyCP-实现文件的复制以及进制转换的更多相关文章

  1. chr()//ord() //进制转换函数//eval()//文件函数//split()

    1.chr() 函数 chr() 用一个范围在 range(256)内的(就是0-255)整数作参数,返回一个对应的字符. 用法:chr(i) i可以是10进制也可以是16进制的形式的数字. 2.or ...

  2. Day02_IP地址详解&进制转换&DOS基本命令与批处理

    学于千峰教育开源课程 感谢 千峰教育官网 b站在线视频 IP地址详解 一.简单局域网的构成 局域网:一般称为内网 简单局域网的构成:交换机.网线.PC(其他IT终端) 交换机:用来组建内网的局域网的设 ...

  3. C++中进制转换问题

    一直在刷题的时候,都会遇到一个坑,就是进制转换的问题.而每一次都傻乎乎的自己去实现一个.所以算是对以前的坑的一个总结. itoa 函数 itoa是广泛应用的非标准C语言和C++语言扩展函数.由于它不是 ...

  4. JAVA之旅(一)——基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算

    JAVA之旅(一)--基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算 Android老鸟重新学一遍JAVA是什么感觉?枯燥啊,乏味啊,而且归纳写博客,都 ...

  5. Python 进制转换 二进制 八进制 十进制 十六进制

    Python 进制转换 二进制 八进制 十进制 十六进制 作者:方倍工作室 地址:http://www.cnblogs.com/txw1958/p/python3-scale.html 全局定义一定不 ...

  6. C#-进制转换、基础语句、语句的总结与练习——★for循环:九九乘法表、三角形、菱形★

    //for循环嵌套练习——打一个九九乘法表 ; i <= ; i++) { ; j <= i; j++) { Console.Write(j + "×" + i + & ...

  7. PHP进制转换[实现2、8、16、36、64进制至10进制相互转换]

    自己写了一个PHP进制转换程序,一个类吧,第一次写这个东东,写这个东东,在处理文本文件时能用得到.   可以实现: 10进制转换2.8.16.36.62进制2.8.16.36.62进制转换10进制 有 ...

  8. java se系列(二) 关键字、注释、常量、进制转换、变量、数据类型转换、运算符

    1 关键字 1.1 关键字的概述 Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名.方法名.类名.包名. 1.2 常见的关键字 备注 ...

  9. 洛谷——P1017 进制转换

    P1017 进制转换 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1\times ...

随机推荐

  1. 移动端控制视频点击播放点击下一个视频时自动停止播放&监听滑动溢出屏幕高度时停止播放

    直接上代码js部分: <script type="text/javascript"> var go;//记录video播放器位置 var video=document. ...

  2. 409 javascript if and while表达式

    数组定义.特点.运算符:算术运算 ++ --(自减 自加) 赋值运算发 =比较:!= == === 逻辑运算 有 && || ! 正则表达式 修饰符 i:用来表示 g:很少演示(在第一 ...

  3. 解析电子墨水屏技术(工作原理与LCD的区别)【转】

    转自:https://blog.csdn.net/weixin_42509369/article/details/84646808 阅读电子书早已成为大家生活中一部分,方便轻巧的电子版书籍更便于携带, ...

  4. from中buttone 和 input type="button" 区别

    在做一个表单提交时碰到的问题, 1.js判断阻止表单提交,如果是form 里面的button的话,恭喜你,你要再换个写法了.<button type="submit" ... ...

  5. mysql的表映射

    参考博客:https://blog.csdn.net/shushugood/article/details/79925150 1.服务器上的操作 在服务器上mysql创建一个实例,名为test_db, ...

  6. iOS -- Effective Objective-C 阅读笔记 (6)

    1: 在 既有类中使用 关联对象存放自定义数据 有时候需要在对象中存放相关信息, 这是我们经常会从对象所属的类中继承一个子类, 然后改用这个子类对象, 然而并非所有的情况下都能这么做,  有时候类的实 ...

  7. CentOS7中MariaDB重置密码

    虚拟机里的MariaDB忘记密码了,连接不上,只能重置MariaDB的密码,步骤参考网络 [root@localhost ~]# mysql -uroot -p Enter password: ERR ...

  8. win10安装mysql5.7.20解压版

    mysql安装包可到官网下载,地址:https://dev.mysql.com/downloads/mysql 1.首先解压文件包,我这解压到E:\install_work\mysql目录下: 2.发 ...

  9. 修改linux终端命令行各字体颜色

    这里我用的是 CentOS 7.5,觉得linux终端命令行全部为白色,会经常导致命令与输出内容难以分辨.于是上网找到修改linux终端命令行颜色的方法,发现通过定义PS1环境变量即可实现,下面我以r ...

  10. 蒙特卡诺近似与PBM

    介绍蒙特卡诺近似的例子代码 #include<fstream> #include<iostream> #include<cstdlib> #include<c ...