java的数据输入:从控制台输入数据.doc_第1页
java的数据输入:从控制台输入数据.doc_第2页
java的数据输入:从控制台输入数据.doc_第3页
java的数据输入:从控制台输入数据.doc_第4页
java的数据输入:从控制台输入数据.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

VIP免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

java的数据输入:从控制台输入数据Java控制台是一种图形用户界面(GUI),其作用有二:一是输入数据,二是显示输出结果。通过在控制台的输入输出,就使用户能完成配置、监视、维护和故障排除等工作。Java控制台虚拟机是否具有控制台取决于底层平台,还取决于调用虚拟机的方式。如果虚拟机从一个交互式命令行开始启动,且没有重定向标准输入和输出流,那么其控制台将存在,并且通常连接到键盘并从虚拟机启动的地方显示。如果虚拟机是自动启动的,例如由后台作业调度程序启动,那么它通常没有控制台。因此,对于普通微机里的java虚拟机来说,通常控制台就是指的显示器和键盘,即:用显示器输出结果、用键盘输入数据。由于输出相对比较简单,这里主要讨论输入数据的方式。从控制台输入数据的方式有多种,jdk1.4以前主要是使用标准输入流的方式,jdk5.0增加了使用Scanner类的方式,jdk6.0又增加了使用Console类的方式。7.8.1 使用标准输入流的方式标准输入流在7.6.2中已经讨论过,例7-13和例7-14的数据就是从控制台(键盘)输入的,办法很简单,即使用标准输入流System.in获得。也可以将System.in桥接至字符流,从字符流中读入数据。例7-22文件复制程序,本例中先使用InputStreamReader获取标准输入流System.in,再用字符流BufferedReader包装InputStreamReader,以读取源文件名和目标文件名。1: import java.io.*;2: public class Example7_22 3: public static void main(String args) 4: try 5: BufferedReader br = new BufferedReader(new InputStreamReader(System.in);6: String srcFile = null, dstFile = null;7: System.out.print(请输入源文件名:);8: srcFile = br.readLine(); /用缓冲字符流获得源文件名9: System.out.print(请输入目标文件名:);10: dstFile = br.readLine(); /用缓冲字符流获得目标文件名11: byte data=new byte1;12: BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile);13: BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dstFile);14: while(bis.read(data) != -1) bos.write(data);15: bos.flush();16: System.out.println(文件复制成功!);17: bis.close();18: bos.close();19: catch(IOException e)20: e.printStackTrace();21: 22: 23: 可见利用标准输入流进行控制台输入的方式非常麻烦:如果从键盘获取的是字符串,需要采用BufferedReader类来进行处理;如果获取的是其他类型数据,需要手工进行转换;在读取的过程中还必须捕获IOException。不过这是JDK1.4及更早版本中从控制台读取数据唯一办法。7.8.2 使用Scanner类的方式从JDK5.0开始,java.util包中增加了Scanner类,它是一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。Scanner类从字面上讲是“扫描”的意思,它把给定的字符串解析成Java的各种基本数据类型,用于分解字符串的默认的分隔符是空格,也可以定制。其构造方法如表7-15。表7-15 Scanner类的构造方法方法描述Scanner(File source)Scanner(File source, String charsetName)构造一个新的 Scanner,其值是从指定文件扫描获得。后者指定了字符集。Scanner(InputStream source)Scanner(InputStream source, String charsetName)构造一个新的 Scanner,其值是从指定的输入流扫描获得。后者指定了字符集。Scanner(Readable source)构造一个新的 Scanner,其值是从指定源扫描获得。Scanner(ReadableByteChannel source)Scanner(ReadableByteChannel source, String charsetName)构造一个新的 Scanner,其值是从指定信道扫描获得。后者指定了字符集。Scanner(String source)构造一个新的 Scanner,其值是从指定字符串扫描获得。由表7-15可见,Scanner可以从指定的文件、输入流、源、信道或字符串等多种来源构造获得。要从控制台读取数据,使用参数为InputStream的方法,传递标准输入流System.in给它,此时Scanner扫描该输入流中的字符,同时还可以让读入的字符串匹配一定的正则表达式模式,如果不匹配时将抛出InputMismatchException异常。Scanner封装了很多方法,比如方法next就可以从各种输入流中连续读入字符串。不仅如此,它还可以读入除char之外的其他七种基本类型和两个大数字类型,并且不需要手工进行转换,如方法nextInt将读入的下一数据转换为int变量,方法nextByte将读入的下一数据转换为byte变量,方法nextLine将读入的下一行转换为String变量,等等。例7-23文件复制程序,本例中使用Scanner类读取源文件名和目标文件名。1: import java.io.*;2: import java.util.*;3: public class Example7_23 4: public static void main(String args) 5: String srcFile = null, dstFile = null;6: Scanner scanner = new Scanner(System.in);7: System.out.print(请输入源文件名:);8: srcFile = scanner.nextLine();9: System.out.print(请输入目标文件名:);10: dstFile = scanner.nextLine();11: try 12: byte data=new byte1;13: BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile);14: BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dstFile);15: while(bis.read(data) != -1) bos.write(data);16: bos.flush();17: System.out.println(文件复制成功!);18: bis.close();19: bos.close();20: catch(IOException e)21: e.printStackTrace();22: 23: 24: 可见从键盘读取的代码得到了很大简化,并且不必再捕获或声明IOException,但这并不是Scanner将控制台输入简单化了,而是在其内部的实现中对各种输入字符的处理进行了更高层次的封装,同时已经把IOException处理了。例7-24通过控制台输入多个正整数,计算奇数和与偶数和。1: import java.util.*;2: public class Example7_24 3: public static void main(String args) 4: int i, odd = 0, even = 0;5: System.out.print(输入正整数,以空格或回车分开,输入非数字结束输入:);6: Scanner scanner = new Scanner(System.in);7: while(scanner.hasNextInt()8: i = scanner.nextInt();9: if(I % 2 != 0) odd = odd + i;10: else even = even + i;11: 12: Scanner.close();13: System.out.println(奇数和是: + odd + n偶数和是: + even);14: 15: 运行结果为:输入正整数,以空格或回车分开,最后输入一个非数字结束输入操作:3 4 5 6 7 22 3 f奇数和是:18偶数和是:327.8.3 使用Console类的方式从JDK6.0开始,又在java.io包中增加了一个Console类,该类用于获得与当前Java虚拟机关联的基于字符的控制台设备。在纯字符的控制台界面下,可以更加方便的读入数据。先来看使用Console类的获取源文件名和目标文件名的文件复制程序。例7-25文件复制程序,本例中使用Console类读取源文件名和目标文件名。1: import java.io.*;2: public class Example7_23 3: public static void main(String args) 4: String srcFile = null, dstFile = null;5: Console console = System.console();6: if (console = null) System.out.println( 不可获得控制台! );7: else8: srcFile = console.readLine(请输入源文件名:);9: dstFile = console.readLine(请输入目标文件名:);10: /与例7-23中1122行相同11: 12: 13: 以前输入数据前的提示信息需要使用System.out.print();来输出,但是使用Console类,可以在方法参数中直接放入提示信息,这进一步简化了代码。Console类直接继承自Object类,使用默认的构造方法,它提供的方法不多,表7-16中列出了Console类的方法。表7-16 Console类的方法方法描述Reader reader()获取与此控制台关联的唯一Reader对象。String readLine()String readLine(String fmt, Object. args)从控制台读取单行文本。后者提供一个格式化提示。char readPassword()char readPassword(String fmt, Object. args)从控制台读取密码,禁用回显。后者提供一个格式化提示。PrintWriter writer()获取与此控制台关联的唯一PrintWriter对象。Console printf(String format, Object. args)使用指定格式字符串和参数将格式化字符串写入此控制台输出流。Console format(String fmt, Object. args)使用指定格式字符串和参数将格式化字符串写入此控制台的输出流中。void flush()刷新控制台,并强制立即写入所有缓冲的输出。这些方法中,readPassword是一个很重要的方法,它可以不回显输入密码,这对于需要在控制台中输入密码等敏感信息是一种很好的方式。例7-26使用Console类的readPassword方法读取密码信息。1: import java.io.*;2: public class Example7_26 3: public static void main(String args) 4: Console console = System.console();5: if( console = null ) System.out.println( 不可获得控制台! );6: else 7: String user = console.readLine(请输入用户名: );8: String pwd = new String(console.readPassword(请输入密码:);9: console.printf( 用户名是: %sn, user);10: console.printf( 密码是: %sn, pwd);11: pwd = ; /密码清零!12: console.printf( 密码使用后应清零!清零后密码为: %sn, pwd);13: 14: 15: 在命令行方式下,程序运行结果:请输入用户名:fg请输入密码:用户名是: fg密码是: ghj密码使用后应清零!清零后密码为:可见输入密码时,控制台是不显示这些密码字符的,但是程序可以得到输入的密码字符串。方法readPassw

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论