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