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. 线程的start方法和run方法的区别

    run方法及结果 public class MyThread extends Thread { @Override public void run() { System.out.println(&qu ...

  2. C语言之路-3-循环

    1.while循环计算数字位数 #include<stdio.h> int main() { ; int x; printf("请输入数字:"); scanf(&quo ...

  3. CEC和ARC介绍

    众所周知,HDMI作为一个数字化视频音频的接收标准,是可以同时传输视频和音频的,当然随着HDMI版本的提升,它的功能也一直在增强.事实上 当HDMI升级到1.3时,人们就发现了HDMI多了一个CEC功 ...

  4. 给Ubuntu系统清理垃圾

    原文地址:https://blog.csdn.net/levon2018/article/details/81746613 1.清理下载的软件包  不过与你想象的可能有很大的不同,Ubuntu系统在运 ...

  5. [C][变量作用域]语句块

    概述 C语言作用域有点类似于链式结构,就是下层能访问上层声明的变量,但是上层则不能访问下层声明的变量: #include <stdio.h> #define TRUE 1 int main ...

  6. Java学习之Java接口回调理解

    Java接口回调 在Java学习中有个比较重要的知识点,就是今天我们要讲的接口回调.接口回调的理解如果解释起来会比较抽象,我一般喜欢用一个或几个经典的例子来帮助加深理解. 举例:老板分派给员工做事,员 ...

  7. 阿里云学生服务器搭建网站-Ubuntu16.04安装php开发环境

    阿里云学生服务器搭建网站(2)-Ubuntu16.04安装php开发环境  优秀博文:https://www.linuxidc.com/Linux/2016-10/136327.htm https:/ ...

  8. RxPermissions Usage

    refs:https://github.com/tbruyelle/RxPermissions https://www.jianshu.com/p/c3546e5cd2ffhttps://www.ji ...

  9. Redis数据结构之quicklist

    本文及后续文章,Redis版本均是v3.2.8 我们在使用Redis对外暴露的list数据结构时,给我们带来极大的便利性.其底层实现所依赖的内部数据结构就是quicklist. 我们先来回忆下list ...

  10. js要怎么接收后端传的excel文件流?

    方法1: 无需js,直接用a标签去接你的输出流 <a href="<你的返回流的Action路径>" >下载</a> 方法2:使用js,前提是你 ...