MyCP-实现文件的复制以及进制转换
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-实现文件的复制以及进制转换的更多相关文章
- chr()//ord() //进制转换函数//eval()//文件函数//split()
1.chr() 函数 chr() 用一个范围在 range(256)内的(就是0-255)整数作参数,返回一个对应的字符. 用法:chr(i) i可以是10进制也可以是16进制的形式的数字. 2.or ...
- Day02_IP地址详解&进制转换&DOS基本命令与批处理
学于千峰教育开源课程 感谢 千峰教育官网 b站在线视频 IP地址详解 一.简单局域网的构成 局域网:一般称为内网 简单局域网的构成:交换机.网线.PC(其他IT终端) 交换机:用来组建内网的局域网的设 ...
- C++中进制转换问题
一直在刷题的时候,都会遇到一个坑,就是进制转换的问题.而每一次都傻乎乎的自己去实现一个.所以算是对以前的坑的一个总结. itoa 函数 itoa是广泛应用的非标准C语言和C++语言扩展函数.由于它不是 ...
- JAVA之旅(一)——基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算
JAVA之旅(一)--基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算 Android老鸟重新学一遍JAVA是什么感觉?枯燥啊,乏味啊,而且归纳写博客,都 ...
- Python 进制转换 二进制 八进制 十进制 十六进制
Python 进制转换 二进制 八进制 十进制 十六进制 作者:方倍工作室 地址:http://www.cnblogs.com/txw1958/p/python3-scale.html 全局定义一定不 ...
- C#-进制转换、基础语句、语句的总结与练习——★for循环:九九乘法表、三角形、菱形★
//for循环嵌套练习——打一个九九乘法表 ; i <= ; i++) { ; j <= i; j++) { Console.Write(j + "×" + i + & ...
- PHP进制转换[实现2、8、16、36、64进制至10进制相互转换]
自己写了一个PHP进制转换程序,一个类吧,第一次写这个东东,写这个东东,在处理文本文件时能用得到. 可以实现: 10进制转换2.8.16.36.62进制2.8.16.36.62进制转换10进制 有 ...
- java se系列(二) 关键字、注释、常量、进制转换、变量、数据类型转换、运算符
1 关键字 1.1 关键字的概述 Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名.方法名.类名.包名. 1.2 常见的关键字 备注 ...
- 洛谷——P1017 进制转换
P1017 进制转换 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1\times ...
随机推荐
- java web添加mysql过程中遇到的错误及解决办法
问题一:遇到提示找不到驱动 com.mysql.jdbc.Driver 起初项目中是导入了mysql-connector-java-5.1.45-bin.jar 包的,但是一直依然报错,最后去官网 ...
- 一个基于Net 的CMS -- Umbraco CMS
一个基于Net 的CMS -- Umbraco CMS: https://umbraco.com/ Sitecore 和 EPiServer http://www.bubuko.com/i ...
- Lua中__index和__newindex实践
[具有默认值的table] 我们都知道,table中的任何字段的默认值都是nil,但是通过元表,我们可以很容易的修改这一规定,代码如下: function setDefault(tb, default ...
- Lua中的元表与元方法
[前言] 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理 ...
- 更改Ubuntu默认python版本的方法
当你安装 Debian Linux 时,安装过程有可能同时为你提供多个可用的 Python 版本,因此系统中会存在多个 Python 的可执行二进制文件.一般Ubuntu默认的Python版本都为2. ...
- iOS 新建xib文件时,最外层view的约束问题
今天用在利用xib实例化view 时, 生成的view的自动布局总是用问题.具体来说,宽和高都不能和父view正确变化.仔细检查,发现下图: 注意这里右上角的Autoresizing部分,并没有设置正 ...
- C#+EntityFramework编程方式详细之Database First
Database First “Database First”模式即“数据库优先”,其实Database First 与Model First 很类似,只不过一个是有数据可一个是创建数据库,具体的操作 ...
- ionic3 安卓硬件返回
platform.ready().then(() => { this.platform.registerBackButtonAction(() => { let activePortal ...
- jmeter测试wordpress使用base64进行鉴权
1.下载插件 对密码进行加密 2.安装插件 3.使用插件 4.使用base64对上面获取到的密码进行二次加密 echo -n "用户:密码" | base64 将以上命令键入lin ...
- C#学习-子类的初始化顺序
使用了继承之后,当我们初始化一个子类时,除了会调用子类的构造函数外,同时也会调用基类的构造函数. 子类的初始化顺序如下: (1)初始化类的实例字段: (2)调用基类的构造函数: (3)调用子类的构造函 ...