— 本文参照 Learn Java for Android Development (第三版)
前面的介绍的HelloWorld和DumpArgs类主要是告诉我们怎么用我们的程序去输出一些内容,我们可以直接打印在屏幕上,也可以把输出内容保存到一个文件里面。接下来会用一些新的例子告诉大家怎么往我们的程序输入一些东西。
public class EchoText
{
public static void main(String[] args)
{
boolean isRedirect = false;
if (args.length != 0) isRedirect = true;
int ch;
try{
while ((ch = System.in.read()) != ((isRedirect) ? -1 : '\n'))
System.out.print((char) ch);
}catch (java.io.IOException ioe){
System.err.println("I/O error");
}
System.out.println();
}
}
这个EchoText比之前介绍的HelloWorld类要复杂一些了。不过没关系,我们一句一句来看。首先这个类是定义个一个布尔变量isRedirect,并且初始化为false。用这个布尔变量来标识本程序是从键盘读取输入还是从文件直接读取输入。默认值false表示默认是从键盘读入。
在这个程序里面我们使用的是判断有无命令行参数来决定程序是接受的键盘输入还是直接通过读取文件获取数据。如果命令行参数的值不为0,则赋值isRedirect为true,表示读取文件,否则就赋值isRedirect为false表示接受的是键盘输入(键盘输入的话结束符是enter键)。
接着往后面看定义了一个整形变量int,用来保存我们的输入内容。再后面的一段代码被一个try.....catch语句包围起来了。一般用这两个关键字包起来的代码是在运行的时候极有可能会抛出异常,catch就是用来捕获这些抛出的异常的。具体的用法后面肯定是会介绍的。
try语句的主体是一个用来读取输入数据的while循环。首先调用系统的System类读入数据并将数据保存在ch变量中。直到输入的值ch为-1(isRedirect为true的时候)或者‘\n’(isRedirect为false的时候)的时候结束while循环。
如果输入的ch不是-1或者‘\n’的话就先把它转化为char类型然后输出。(char)表示的就是把后面的数据强制转化为char类型。这里我们还是用System.out.print()来输出数据,注意这里是不换行的,要跟println()区分。
如果我们执行程序的时候带了命令行参数,那么程序就是从文件里面直接读取数据。现在假设我们的文件是存储在移动设备里面的,恰好执行程序的时候设备被移除了,这时候程序就没办法读取到设备里面的文件,即文件读取失败,这时候我们的System.in.read()就会抛出一个i/o异常用来描述这个错误。catch就会捕获到这个异常,catch里面的语句就会执行,通过标准错误流System.err.println("I/O error");.打印"I/O error"。其实System.error跟System.out的用法是差不多的,只是一个用来打印正常的程序数据,另一个是用来打印程序出错时系统反馈给我们的数据。
执行这个程序的话有两种方法:
1 从键盘输入:
javac EchoText.java
java EchoText
This is a test. //看到屏幕上的光标以后,用键盘向程序输入这些数据后按enter键就会看到这些数据被打印在了屏幕上。
2 从文件读取数据
java EchoText
请注意这时候程序只有一个命令行参数:x,并不是两个。跟在文件名后面的才算是参数,文件名不会被判定为参数的。这时候我们会看到EchoText.java文件就打印到了屏幕上。
假如我们按这种方式执行看看:java EchoText
这种情况下其实是没有命令行参数的,我们的程序接受的输入来自键盘,而实际的键盘输入来自EchoText.java,又因为代码的每一行都有一个行结束符'\n',所以代码会只打印代码的第一行。
特殊情况:如果我们把while循环改成这个样子:while ((ch = System.in.read()) != -1),并且使用键盘输入,那么我们的循环就永远停不下来,因为输入永远也不等于-1,这个时候我们只能通过Ctrl+C来结束我们的程序了(这是在windows平台上,如果是其他平台的话就要找到与这个等效的按键)。
这篇好长好长啊。。。。。
Page 14