程序开发过程中,需要从键盘获取输入值是常有的事,但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. php自定义函数: amr转mp3格式

    <?php function amr2mp3($file){ if (file_exists($file . '.mp3') == true) { return; } else { $param ...

  2. opengl绘制图片

    #include <GL/glew.h>#include <glut.h>#include "FreeImage.h"#include <stdio. ...

  3. [note]一类位运算求最值问题

    [note]一类位运算求最值问题 给定一些数,让你从中选出两个数a,b,每次询问下列中的一个 1.a and b的最大值 2.a xor b的最大值 3.a or b的最大值 神仙们都是FWT,小蒟蒻 ...

  4. 【ELK】抓取AWS-ELB日志的logstash配置文件

    前言 ELK搭建没有难度,难的是logstash的配置文件,logstash主要分为三个部分,input,filter和output. input,输入源可选的输入源由很多,详情见ELK官网,这里我们 ...

  5. 使VS自动生成代码注释

    1.注释模板位置C:\Program Files\Microsoft Visual Studio 11.0\Common7\IDE\ItemTemplatesCache 里面有各种脚本的模板 2.找到 ...

  6. 用cocos2d-html5做的消除类游戏《英雄爱消除》(3)——游戏主界面

    游戏主界面,同时也是主程序,包括sprite的生成加入以及游戏状态的控制. 下面同样贴下源码再讲解; /** * Power by html5中文网(html5china.com) * author: ...

  7. Mysql——JDBC编程 理论介绍

    一.JDBC简介(来自俞琰--数据库老师) Java数据库编程主要使用JDBC技术.JDBC是一种用于执行SQL语句的Java API.它由一组用Java编写的类和接口组成.JDBC为开发人员提供了一 ...

  8. php关于<<<的用法

    Heredoc技术,在正规的PHP文档中和技术书籍中一般没有详细讲述,只是提到了这是一种Perl风格的字符串输出技术.但是现在的一些论坛程序,和部分文章系统,都巧妙的使用heredoc技术,来部分的实 ...

  9. 【leetcode刷题笔记】Search in Rotated Sorted Array II

    Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...

  10. codevs1279 Guard 的无聊

    题目描述 Description 在那楼梯那边数实里面,有一只 guard,他活泼又聪明,他卖萌又霸气.他每天刷题虐 场 D 人考上了 PKU,如果无聊就去数一数质数~~ 有一天 guard 在纸上写 ...