基于命令行的java应用程序样例

本文介绍了一种基于Java的命令行程序设计方法,包括从System.in读取数据、处理特定命令(如exit)、记录行号等功能。通过示例代码展示了如何实现这些功能,并讨论了资源释放的重要性。

背景

    在学习io的时候,都会讲到标准输入输出的东西。这里将最容易出现的几个问题整理一下,方便以后的使用和参考。

命令行程序的特点:

    命令行参数解析

    从System.in中按每行进行数据读取

程序示例

我们先给出一个最简单的例子,然后加入变化。

原始

这个例子实现了一个读取Systrem.in的每一行,并处理第一行的小程序(我们的处理方式就是把它们都打印出来)。

import java.io.*;

import wy.tools.log.P;
import wy.tools.regexp.Regexp;

public class ReadLineFromSystemIn {

	/**
	 * 从System.in中读取每行
	 * @param args
	 */
	public static void main(String[] args) {

		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader bis = new BufferedReader(isr);//转成buffered才有读行的能力
		String s;
		try {
			s = bis.readLine();
			while(null != s) {
			
				handleLine(s);
				s = bis.readLine();
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				bis.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	private static void handleLine(String s) {
		
		P.rintln("read line:" + s);
	}

}

 

这里有个要说明的地方就是关于流的关闭问题,应该写在finally中来确保一定会被执行,如果写一try中可以会由于前面代码出现异常后没有执行close,程序不断的进行这个流程应会不断的吞噬系统资源,后果严重。

变化1 如果输入exit程序自动结束

	private static void handleLine(String s) {
		
		if (Regexp.isMatch("exit", s))
		closeApp();
		P.rintln("read line:" + s);
	}

	private static void closeApp() {
		System.exit(0);
	}

需要将handleLine进行修改,使用System.exit(0)表示程序主动的正常退出。


变化2 加入行号的读取功能

	public static void main(String[] args) {

		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(isr);//转成buffered才有读行的能力
		LineNumberReader lnr = new LineNumberReader(br); //支持行号读取的装饰器
		String s;
		try {
			s = lnr.readLine();
			int lineNumber = lnr.getLineNumber();
			while(null != s) {
			
				handleLine(s,lineNumber);
				s = lnr.readLine();
				lineNumber = lnr.getLineNumber();
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				lnr.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	private static void handleLine(String s, int lineNumber) {
		
		if (Regexp.isMatch("exit", s))
		closeApp();
		P.rintln("read line " + lineNumber + ": " + s);
	}


读取行号就要使用LineNumberReader装饰器,里面提供了getLineNumber()的方法。

注意:系统每调用一次readLine()会自动加行号,所以在readLine之后调用就可心得到从1开始的行号。

如何测试cmd-line程序

可以参考【怎么测试】1. 如何测试命令行程序?

1、 创建类实现基本对象和他们关系的管理,包括学生、教学班、课程、成绩、教师等。使用集合框架存储所有对象。学生至少包含学号、姓名、性别等信息。教学班至少包含教师、课程名字、总人数、教学班号、开课学期等信息。课程至少包含课程编号、课程名字等信息。教师至少包含教师编号、姓名等信息。 2、随机生成学生,数量不少于100。一个教学班有一个教师上一门课程,教学班的学生数量不少于20。课程数量不少于3门。教师数量不少于6个。一门课至少有两个老师上课。每个学生选择至少选择3门课程。一个学生在一个教学班上一门课,考试后取得一个成绩。一门课的成绩构成有4部分构成,包括平时成绩、期中考试、实验成绩和期末考试成绩,然后计算出总成绩。成绩随机生成,均为整数。 3、分阶段模拟教学过程。如执行一个命令,可以生成一个教学班的所有学生的平时成绩。第一步,生成初始化数据,包括教师,学生、课程,教学班等;第二步,学生选课,随机进行,为每门课程的教学班安排学生。第三步,获得平时成绩,获得期中成绩,获得实验成绩,获得期末成绩,最后计算总成绩。 4、能够显示一个教学班级的学生,可以根据学号排序,可以根据成绩排序。可以通过名字查询成绩,可以按照各科成绩和总成绩进行排名显示,可以统计各课程学生成绩的分数段分布。 5、可以实现自己的扩展功能。注意类和类之间的关系。充分利用继承,多态等特性,使用上抽象类,接口,泛型,内部类等设计元素
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值