程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代表遇到这种情况我们就束手无策,请你看以下三种解决方法吧:

  1. 使用System.out.read()从控制台接收一个字符,只能针对一个字符的获取,同时,获取进来的变量的类型只能是char,当我们输入一个数字,希望得到的也是一个整型变量的时候,我们还得修改其中的变量类型,这样就显得比较麻烦。
  2. 用BufferedReader类和InputStreamReader类从控制台接收一个字符串,然后再对字符串进行处理。
  3. 最简单,最强大的,就是用Scanner类。

 最常用的莫过于Scanner 类了,简单强大,但如果输入数据巨大的话,就另当别论了。下面看一个POJ上的查并集的例子。

用Scanner 读取数据

  1. package Search_Union_Set;
  2.  
  3. import java.util.Scanner;
  4. /*Memory:5844K Time:4235MS*/
  5. public class Poj_2524_WithScanner {
  6.  
  7. static int MAXN = 50001;
  8. static int pa[] = new int[MAXN];
  9. static int rank[] = new int[MAXN];
  10. static int count;
  11.  
  12. static void make_set(int x) {
  13. pa[x] = x;
  14. rank[x] = 0;
  15. }
  16.  
  17. static int find_set(int x) {
  18. int r = x, temp;
  19. while (pa[r] != r)
  20. r = pa[r];
  21. while (x != r) {
  22. temp = pa[x];
  23. pa[x] = r;
  24. x = temp;
  25. }
  26. return x;
  27. }
  28.  
  29. static void union_set(int x, int y) {
  30. x = find_set(x);
  31. y = find_set(y);
  32. if (x == y)
  33. return;
  34. if (rank[x] > rank[y]) {
  35. pa[y] = x;
  36. } else {
  37. pa[x] = y;
  38. if (rank[x] == rank[y])
  39. rank[y]++;
  40. }
  41. count--;
  42. }
  43.  
  44. public static void main(String[] args) {
  45. // TODO Auto-generated method stub
  46. Scanner sc = new Scanner(System.in);
  47. int n, m, x, y, i;
  48. int time = 0;
  49. while (true) {
  50. n = sc.nextInt();
  51. m = sc.nextInt();
  52. count = n;
  53. if (m == n && n == 0)
  54. break;
  55. if (m == 0) {
  56. System.out.println("1");
  57. continue;
  58. }
  59. for (i = 0; i < n; i++)
  60. make_set(i);
  61. for (i = 0; i < m; i++) {
  62. x = sc.nextInt();
  63. y = sc.nextInt();
  64. union_set(x, y);
  65. x = y;
  66. }
  67. time++;
  68. System.out.println("Case " + time + ": " + count);
  69. }
  70. }
  71. }

用BufferedReader类和InputStreamReader类从控制台接收

  1. package Search_Union_Set;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.util.StringTokenizer;
  7. /*Memory:5260K Time:719MS*/
  8. public class Poj_2524_WithBufferedReader {
  9.  
  10. static int MAXN = 50001;
  11. static int pa[] = new int[MAXN];
  12. static int rank[] = new int[MAXN];
  13. static int count;
  14. static void make_set(int x) {
  15. pa[x] = x;
  16. rank[x] = 0;
  17. }
  18.  
  19. static int find_set(int x) {
  20. int r = x, temp;
  21. while (pa[r] != r)
  22. r = pa[r];
  23. while (x != r) {
  24. temp = pa[x];
  25. pa[x] = r;
  26. x = temp;
  27. }
  28. return x;
  29. }
  30.  
  31. static void union_set(int x, int y) {
  32. x = find_set(x);
  33. y = find_set(y);
  34. if (x == y)
  35. return;
  36. if (rank[x] > rank[y])
  37. {
  38. pa[y] = x;
  39. } else {
  40. pa[x] = y;
  41. if (rank[x] == rank[y])
  42. rank[y]++;
  43. }
  44. count--;
  45. }
  46.  
  47. public static void main(String[] args) throws IOException {
  48. // TODO Auto-generated method stub
  49. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  50. int n, m, x, y, i;
  51. int time = 0;
  52. while (true) {
  53. String str = br.readLine();
  54. StringTokenizer stoken = new StringTokenizer(str, " ");
  55. n = Integer.valueOf(stoken.nextToken());
  56. m = Integer.valueOf(stoken.nextToken());
  57. count = n;
  58. if (m == n && n == 0)
  59. break;
  60. if (m == 0) {
  61. System.out.println("1");
  62. continue;
  63. }
  64. for (i = 0; i < n; i++)
  65. make_set(i);
  66. for (i = 0; i < m; i++) {
  67. str = br.readLine();
  68. stoken = new StringTokenizer(str, " ");
  69. x = Integer.valueOf(stoken.nextToken());
  70. y = Integer.valueOf(stoken.nextToken());
  71. union_set(x, y);
  72. x = y;
  73. }
  74. time++;
  75. System.out.println("Case " + time + ": " + count);
  76. }
  77. }
  78. }

用BufferedReader类和InputStreamReader类明显要比Scanner 快得多。

Scanner一个可以使用正则表达式来分析基本类型和字符串的简单文本扫描器。 Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配。然后可以使用不同的 next 方法将得到的标记转换为不同类型的值。

BufferedReader从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。 通常,Reader 所作的每个读取请求都会导致对基础字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。

InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,否则可能接受平台默认的字符集。 每次调用 InputStreamReader 中的一个 read() 方法都会导致从基础输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从基础流读取更多的字节,使其超过满足当前读取操作所需的字节。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Java中读取输入方式的性能比较的更多相关文章

  1. Java中读取properties资源文件

    一.通过ResourceBundle来读取.properties文件 /** * 通过java.util.resourceBundle来解析properties文件. * @param String ...

  2. Java中读取文件

    Java中读取文件,去除一些分隔符,保存在多维数组里面 public void readFile(String filePath) { File file=new File(filePath); Ar ...

  3. java中读取特殊文件的类型

    java中读取特殊文件的类型: 第一种方法(字符拼接读取): public static String getType(String s){ String s1=s.substring(s.index ...

  4. Java中读取.properties配置文件的通用类

    由于Java中读取配置文件的代码比较固定,所以可以将读取配置文件的那部分功能单独作为一个类,以后可以复用.为了能够达到复用的目的,不能由配置文件中每一个属性生成一个函数去读取,我们需要一种通用的方法读 ...

  5. 五种方式让你在java中读取properties文件内容不再是难题

    一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC ...

  6. java中基本输入输出流的解释(flush方法的使用)

    转自:http://fsz521job.itpub.net/post/5606/34827 网络程序的很大一部分是简单的输入输出,即从一个系统向另一个系统移动字节.字节就是字节,在很大程度上,读服务器 ...

  7. Java Map各遍历方式的性能比较

    1. 阐述 对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多.理由是:entrySet方法一次拿到所有key和value的集合:而keySet拿到的 ...

  8. C语言中的输入方式

    在c语言中,有gets().scanf().getchar()等输入方式,但是不同的方式处理的方式不同. scanf()读取时遇见tab.space.enter时会结束读取,不会舍弃最后的回车符(即回 ...

  9. Java中如何输入一个字符

    今天在QQ群上看见有人问如何在Java中输入一个字符的问题. 查了下有以下三种方法吧: char c = new java.util.Scanner(System.in).next().charAt( ...

随机推荐

  1. EventLoop(netty源码死磕4)

    精进篇:netty源码  死磕4-EventLoop的鬼斧神工 目录 1. EventLoop的鬼斧神工 2. 初识 EventLoop 3. Reactor模式回顾 3.1. Reactor模式的组 ...

  2. apache虚拟主机配置: 设置二级目录访问跳转

    <VirtualHost *:> DocumentRoot "d:/www/abc" ServerName www.abc.com Alias /course &quo ...

  3. Apache Shiro 使用手册(三)Shiro 授权(转发:http://kdboy.iteye.com/blog/1155450)

    授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限. 如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限,以及是否拥有打印的权限等等. 一.授权的三要素 授权有着三 ...

  4. 面试问题(HTML和CSS方面)

    1 IE/Win的 HasLayout 2 浮动 float 的定义.float后元素的display属性会发生改变吗?3 CSS 3.0.CSS2.1 中被现代浏览器应用了的规则有哪些?4 父元素定 ...

  5. Ubuntu下,grep的用法

    grep(Global search Regular Expression and Print out the line)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.U ...

  6. POJ3614 贪心+优先队列

    题意:m头牛每头牛有minspf和maxspf,n种spf为spf[i]的防晒霜每种l[i]瓶,尽可能给数量多的牛涂防晒霜,每头牛最多涂一瓶. 思路:贪心想法,实现是每次取出minspf<=sp ...

  7. POJ 3070 矩阵mob

    . 矩阵高速幂想法与快速幂相同 #include<iostream> #include<cstdio> #include<cstring> #define MOD ...

  8. 【LeetCode】删除链表的倒数第N个节点

    给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...

  9. Spring Cloud之Feign客户端超时时间配置

    关于雪崩效应: 默认情况下tomcat只有一个线程去处理客户端发送的所有请求.高并发情况下,如果客户端请求都在同一接口,tomcat的所有线程池去处理,导致其他接口服务访问不了,等待. Tomcat有 ...

  10. 大话设计模式--桥接模式 Bridge -- C++实现实例

    1. 桥接模式: 将抽象部分与它的实现部分分离,使它们都可以独立的变化. 分离是指 抽象类和它的派生类用来实现自己的对象分离. 实现系统可以有多角度分类,每一种分类都有可能变化,那么把这种多角度分离出 ...