编程实现类似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的功能。我们需要注意的以及考虑的细节有以下几点:

  1. 源文件和目标文件分属不同的文件形式,且由命令行提供。
  2. 程序可以接受“-tx”或“-xt”参数来选择转换形式(不需要实现类似cp命令的其他参数
    3.文本文件中内容为十进制数字(意味着没有其他形式的字符
  3. 如何简单实现二进制与十进制的相互转换

1.伪代码实现

程序读取命令行输入的三个参数,参数为“-tx”或“-xt”,否则报错并终止运行。
当参数为“-tx”时,读取txt文件中的数字,转换为二进制后写入bin文件
当参数为“-xt”时,读取bin文件中的二进制数字,转换为十进制后写入txt文件

2.实现读取命令行参数

在课上,老师曾数次提醒我们注意Java语言的main方法:public static void main(String args[]) 。我们命令行中的字符会自动存储在一个名为args的字符类型数组中,且从args[0]开始存储。如图所示:


注意??:这里老师提到过,java和C语言有所区分。在运行时,java会直接从文件名后的参数开始存储,而C语言则会从文件名开始存储
因此,我们只需要读取args的值,便可以实现“-tx”“-xt”值的判断。

3.实现十进制到二进制的转化

实现十进制到二进制的转化其实就是将笔头上的方法转化成程序语言,这里我选择使用除二取余法,即除k取余法,主要用于将十进制的数转化为k进制。下图摘自百度百科:

代码实现为:

 int sum;
                for (int i = number; i >= 1; i = i / 2) {
                    if (i % 2 == 0) {
                        sum = 0;
                    } else {
                        sum = 1;
                    }
                    result = sum + result;//不断让新计算的sum值置于result之前,实现余数的倒序排列。
                }
            }

4.实现二进制到十进制的转化

实现二进制到十进制的转化更加简单,通过查阅API文档,我们发现Integer.parseInt方法就可以实现这一操作。

5.读入和写入文件

事实上打从一开始我就决定将文件中的数字用数据流读成一个数字字符串,但由于相关的知识理解不透彻,教材中对数据流的介绍我一直认为有点语焉不详,在反复修改代码n次后我决定放弃数据流(或许是我的理解有本质上的错误?还要以后细细研究一番),采用缓冲流来进行文件操作,最后经过一些小调试,成功实现了文件操作。

三、代码截图及运行截图

  • 首先建立一个写有20175308的a.txt和一个空的b.bin文件
  • 运行代码后检查b.bin,内容正确
  • 将b.bin内容换成一串计算好的二进制数1001100010000100001010011 并运行代码
  • 运行程序后打开a.txt,文件中内容正确

四、编程中遇到的问题

  • 写入文件时出现文件无法写入的情况
    解决:检查代码,忽略了flush()的作用,没有刷出缓冲池中的数据。

原文地址:https://www.cnblogs.com/darklord0604/p/10771531.html

时间: 2024-11-09 00:05:28

编程实现类似Linux下cp功能的相关文章

《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 用来二进制文件把转化为文本文件(内容为十进制数字) 二.设计思路 题目要求通过命令行输入的方式输入要读入的文件和要写入的文件并能够完成十进制和二进

Linux C编程之一:Linux下c语言的开发环境

---恢复内容开始--- 今天开始根据Linux C编程相关视频的学习所做的笔记,希望能一直坚持下去... 1.开发环境的构成 编辑器:VI: 编译器:选择GNU  C/C++编译器gcc: 调试器:应用广泛的gdb: 函数库:glibc : 系统头文件:glibc_header: 2.在安装Linux时需要注意事项 在安装时选上“程序开发”中的“开发工具”,就可以自动安装gcc/gdb: 若想开发图形界面,还需要选上GNOME/KDE软件开发. 3.IDE(集成开发环境:集编辑.编译.调试等功

Windows命令行(cmd)下快速查找文件(类似Linux下find命令)

for /r 用法简介 用了Linux下的find命令,觉得查找文件很方便,那么在windows下有没有类似的命令可以遍历目录并通过文件名找到文件呢?答案是有: Windows下的 for /r 命令具有与Linux下 find 命令类似的功能,使用语法上类似: find /r 目录名 %变量名 in (匹配模式1,匹配模式2) do 命令 匹配模式可以是通配类似于: *.jpg:所有.jpg后缀的文件 *test*:所有名称中包含test的文件 注意: 1. 匹配模式中至少带上1个*号 2.

【网络编程基础】Linux下进程通信方式(共享内存,管道,消息队列,Socket)

在网络课程中,有讲到Socket编程,对于tcp讲解的环节,为了加深理解,自己写了Linux下进程Socket通信,在学习的过程中,又接触到了其它的几种方式.记录一下. 管道通信(匿名,有名) 管道通信,在一个进程之中,只能单一的对其写或者是读,而不可以及执行写操作又执行读操作.这一点,我们可以将其想象成我们的水管,分别连着不同的两端,在有水流的时候,一端只能进行输入,另一端只能进行输出,而不可以同时输入和输出. 管道又分为有名管道和匿名管道,两者的区别在于对于匿名管道,其只能在具有亲缘关系的父

windows下类似Linux下的grep命令

今天要查看windws下代理服务器有哪些IP连接过来,但使用 netstat -na 后出现很多连接会话,不方便查看. 想到Linux下的grep非常方便,于是网络上搜寻,还是有类似的命令findstr,改为 netstat -na | findstr 3128 方便很多.

高性能网络服务器编程:为什么linux下epoll是最好,Netty要比NIO.2好?

基本的IO编程过程(包括网络IO和文件IO)是,打开文件描述符(windows是handler,java是stream或channel),多路捕获(Multiplexe,即select和poll和epoll)IO可读写的状态,而后可以读写的文件描述符进行IO读写,由于IO设备速度和CPU内存比速度会慢,为了更好的利用CPU和内存,会开多线程,每个线程读写一个文件描述符. 但C10K问题,让我们意识到在超大数量的网络连接下,机器设备和网络速度不再是瓶颈,瓶颈在于操作系统和IO应用程序的沟通协作的方

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##########################