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

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

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

用Scanner 读取数据

package Search_Union_Set;

import java.util.Scanner;
/*Memory:5844K Time:4235MS*/
public class Poj_2524_WithScanner { static int MAXN = 50001;
static int pa[] = new int[MAXN];
static int rank[] = new int[MAXN];
static int count; static void make_set(int x) {
pa[x] = x;
rank[x] = 0;
} static int find_set(int x) {
int r = x, temp;
while (pa[r] != r)
r = pa[r];
while (x != r) {
temp = pa[x];
pa[x] = r;
x = temp;
}
return x;
} static void union_set(int x, int y) {
x = find_set(x);
y = find_set(y);
if (x == y)
return;
if (rank[x] > rank[y]) {
pa[y] = x;
} else {
pa[x] = y;
if (rank[x] == rank[y])
rank[y]++;
}
count--;
} public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n, m, x, y, i;
int time = 0;
while (true) {
n = sc.nextInt();
m = sc.nextInt();
count = n;
if (m == n && n == 0)
break;
if (m == 0) {
System.out.println("1");
continue;
}
for (i = 0; i < n; i++)
make_set(i);
for (i = 0; i < m; i++) {
x = sc.nextInt();
y = sc.nextInt();
union_set(x, y);
x = y;
}
time++;
System.out.println("Case " + time + ": " + count);
}
}
}

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

package Search_Union_Set;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/*Memory:5260K Time:719MS*/
public class Poj_2524_WithBufferedReader { static int MAXN = 50001;
static int pa[] = new int[MAXN];
static int rank[] = new int[MAXN];
static int count;
static void make_set(int x) {
pa[x] = x;
rank[x] = 0;
} static int find_set(int x) {
int r = x, temp;
while (pa[r] != r)
r = pa[r];
while (x != r) {
temp = pa[x];
pa[x] = r;
x = temp;
}
return x;
} static void union_set(int x, int y) {
x = find_set(x);
y = find_set(y);
if (x == y)
return;
if (rank[x] > rank[y])
{
pa[y] = x;
} else {
pa[x] = y;
if (rank[x] == rank[y])
rank[y]++;
}
count--;
} public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n, m, x, y, i;
int time = 0;
while (true) {
String str = br.readLine();
StringTokenizer stoken = new StringTokenizer(str, " ");
n = Integer.valueOf(stoken.nextToken());
m = Integer.valueOf(stoken.nextToken());
count = n;
if (m == n && n == 0)
break;
if (m == 0) {
System.out.println("1");
continue;
}
for (i = 0; i < n; i++)
make_set(i);
for (i = 0; i < m; i++) {
str = br.readLine();
stoken = new StringTokenizer(str, " ");
x = Integer.valueOf(stoken.nextToken());
y = Integer.valueOf(stoken.nextToken());
union_set(x, y);
x = y;
}
time++;
System.out.println("Case " + time + ": " + count);
}
}
}

用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. SpringBoot中的配置文件

    http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

  2. NOI-linux下VIM的个人常用配置

    路径:/etc/vim/vimrc 打开终端:Ctrl+Alt+T 输入:sudo vim或gedit /etc/vim/vimrc (推荐用gedit,更好操作) 以下是我的配置: "我的 ...

  3. 我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(三)Android客户端功能实现

    我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(一)PC服务器端(地址:http://blog.csdn.net/ouyang_pen ...

  4. 遇到IIS configuration error错误的可以看看,不一定是权限问题

    最近接手了别人的一个 DOT NET项目,编译.调试一切都OK(心里暗暗高兴),发布吧,结果放到服务器上一运行出现Configuration Error错误,提示:“Access to the pat ...

  5. jQuery中通过JSONP来跨域获取数据的三种方式

    第一种方法是在ajax函数中设置dataType为'jsonp' $.ajax({ dataType: 'jsonp', url: 'http://www.a.com/user?id=123', su ...

  6. NSAttributedStringKey

    NSFontAttributeName; //字体,value是UIFont对象 NSParagraphStyleAttributeName;//绘图的风格(居中,换行模式,间距等诸多风格),valu ...

  7. [原创]java WEB学习笔记36:Java Bean 概述,及在JSP 中的使用,原理

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. RabbitMQ点对点的模式

    1.点对点模式  一对一模式.  一个生产者投递消息给队列 只能允许有一个消费者进行消费    如果集群的话 会进行均摊消费   服务器配置不一样 均摊就不优了 长连接 不用三次握手之类的 提高传输效 ...

  9. Codeforces Round #250 (Div. 2) D. The Child and Zoo 并查集

    D. The Child and Zoo time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  10. Thriftpy一个简单的例子

    sleep.thrift文件(什么是thrift文件?),文件内容如下,该文件定义了一个Sleep服务,该服务提供一个sleep方法,sleep方法接受一个32位int类型的参数且没有返回值 serv ...