java自定义Scanner类似功能类的实例讲解

读取键盘输入

package com.zjx.io;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 面试题
 * 读取键盘各个数据类型
 *
 */
public class TestFaceIo {
	public static void main(String[] args) {
		System.out.print("请输入姓名: ");
		String name = MyInput.readString();
		System.out.print("请输入年龄: ");
		int age = MyInput.readInt();
		System.out.print("请输入体重:");
		double weight = MyInput.readDouble();
		System.out.print("请输入性别:");
		char sex = MyInput.readChar();
		System.out.println(name + "\t" + age + "\t" + weight + "\t" + sex);
		MyInput.close();
	}
}
class MyInput{
	static BufferedReader reader = null;
	/**
	 * 读取整数
	 * @return
	 */
	public static int readInt(){
		int num = Integer.parseInt(readString());
		return num;
	}

	/**
	 * 读取浮点数
	 * @return
	 */
	public static double readDouble(){
		double num = Double.parseDouble(readString());
		return num;
	}

	/**
	 * 读取char单个字符
	 * @return
	 */
	public static char readChar(){
		char ch = readString().charAt(0);
		return ch;
	}

	/**
	 * 读取字符串
	 * @return
	 */
	public static String readString(){
		try {
			reader = new BufferedReader(new InputStreamReader(System.in));
			String line = reader.readLine();
			return line;
		} catch (Exception e) {
			//编译异常--》运行异常
			throw new RuntimeException(e);
		}
	}

	/**
	 * 关闭
	 */
	public static void close(){
		if (reader != null) {
			try {
				reader.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

补充知识:java的Scanner与Fmatting

Scanner扫描仪与Fmatting

Programming I/O often involves translating to and from the neatly formatted data humans like to work with. 译文:对I / O进行编程通常涉及到人们喜欢使用的格式正确的数据的转换。(机器翻译的,有点拗口,欢迎大神帮忙翻译的顺口一点,总而言之,将数据转换为人们喜欢的)

为了帮助您完成这些杂务,Java平台提供了两个API。 扫描程序API将输入分为与数据位相关联的各个令牌。 格式API将数据组合成格式良好,易于阅读的格式。(细心地人会发现,扫描程序Scanner和格式化Fmatting是相反的两个操作,一个是分散数据,一个是组合数组)

Scanner

定义:Scanner类型的对象可用于将格式化的输入分解为令牌,并根据其数据类型转换单个令牌。

Scanner我看做用于格式化读取文本文件

scanner扫描流。可以扫描文件与控制台的输入

默认情况下,scanner (扫描器)使用空格分隔令牌。 (空白字符包括空格,制表符和行终止符。有关完整列表,请参阅Character.isWhitespace的文档。)要查看扫描的工作方式,让我们看一下案例,该程序可读取文本文件中的各个单词。 并打印出来,每行一个。

package ff;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;

public class CopyCytes {

	public static void main(String[] args) throws IOException {

		Scanner s=null;
		try {

			s=new Scanner(new BufferedReader(new FileReader("txt/input.txt")));
			//s.useDelimiter(",\\s*");也可以自定义分隔符
			while(s.hasNext()) {

				System.out.println(s.next());
			}	

		}finally {

			if(s!=null) {
				s.close();
			}
		}
	}
}

programe result:

By
default,
a
scanner
uses
white
space
to
separate
tokens.

从以上程序测试可以看出来Scanner扫描仪根据某一个分割符号一行一行的打印数据。

Scanner用完必须关闭底层流

注意:类在处理Scanner对象时调用Scanner的close方法。即使Scanner扫描仪不是流,您也需要关闭它,以表明您已处理完其底层流。

Scanner可以自定义分隔符

若要使用其他标记分隔符,请调用useDelimiter(),指定一个正则表达式。例如,假设您希望令牌分隔符是逗号,后面有空格。你会调用

s.useDelimiter(",\\s*");

Scanner扫描仪支持多种数据类型

上面的示例将所有输入标记视为简单的字符串值

Scanner还支持所有Java语言的基元类型(char除外)以及BigInteger和BigDecimal的标记。

此外,数值可以使用数千个分隔符。

因此,在US语言环境中,Scanner正确地读取字符串“32767”表示整数值。

We have to mention the locale, because thousands separators and decimal symbols are locale specific. So, the following example would not work correctly in all locales if we didn't specify that the scanner should use the US locale. That's not something you usually have to worry about, because your input data usually comes from sources that use the same locale as you do. But this example is part of the Java Tutorial and gets distributed all over the world.

译文:

我们必须提到语言环境,因为数千个分隔符和十进制符号是特定于语言环境的。 因此,如果我们未指定扫描仪应使用美国语言环境,则以下示例在所有语言环境中均无法正常工作。 通常不必担心,因为您的输入数据通常来自与您使用相同语言环境的源。 但是此示例是Java教程的一部分,并在全世界范围内分发。

package ff;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Locale;
import java.util.Scanner;

public class CopyCytes {

	public static void main(String[] args) throws IOException {

		Scanner s = null;
		double sum = 0;
		try {

			s = new Scanner(new BufferedReader(new FileReader("txt/input.txt")));
//			s.useDelimiter(",\\s*");

			s.useLocale(Locale.US);

			while (s.hasNext()) {

				if (s.hasNextDouble()) {

					sum = sum + s.nextDouble();
				} else {
					s.next();

				}
			}

		} finally {

			if (s != null) {
				s.close();
			}
			System.out.println(sum);
		}
	}
}

input.txt文件内容是:

8.5
32,767
3.14159
1,000,000.1

program result:

输出字符串为“ 1032778.74159”。

在某些语言环境( in some locales)中,句点将是一个不同的字符,因为System.out是一个PrintStream对象,并且该类没有提供重写默认语言环境的方法。 我们可以覆盖整个程序的语言环境,也可以只使用格式化,如下一主题“格式化”中所述。

重点:

设置语言环境

format

实现(格式fammatting)的流对象是字符流类PrintWriter或字节流类PrintStream的实例。

Note: The only PrintStream objects you are likely to need are System.out and System.err. (See I/O from the Command Line for more on these objects.) When you need to create a formatted output stream, instantiate PrintWriter, not PrintStream.

原文:

Like all byte and character stream objects, instances of PrintStream and PrintWriter implement a standard set of write methods for simple byte and character output. In addition, both PrintStream and PrintWriter implement the same set of methods for converting internal data into formatted output. Two levels of formatting are provided: print and println format individual values in a standard way. format formats almost any number of values based on a format string, with many options for precise formatting.

译文:

像所有字节和字符流对象一样,PrintStream和PrintWriter的实例实现一组标准的写Write方法,用于简单的字节和字符输出。 此外字节流输出类PrintStream和字符流类PrintWriter都实现了将内部数据转换为格式化输出的相同方法集。 提供了两种格式设置:

print和println以标准方式格式化各个值。

Fammatting(格式)会基于一个格式字符串对几乎任何数量的值进行格式设置,并提供许多用于精确格式设置的选项。

原文:

Invoking print or println outputs a single value after converting the value using the appropriate toString method. We can see this in the Root example:

译文:

调用print或println将输出一个经过toString方法转换的值。 我们可以在以下示例中看到这一点:

package ff;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Locale;
import java.util.Scanner;

public class CopyCytes {

	public static void main(String[] args) throws IOException {

		Scanner s = null;
		double sum = 0;

		int i = 2;
		double r = Math.sqrt(i);

		System.out.print("the square root of ");
		// i的第一次格式化,使用的是print的重载
		System.out.print(i);
		System.out.print(" is ");
		// r的第一次格式化也是使用的Print的重载
		System.out.print(r);
		System.out.println(".");

		i = 5;
		r = Math.sqrt(i);
		// i 和 r的第二次格式化是使用的编译器隐藏的自动的格式化
		System.out.println("The square root of " + i + " is " + r + ".");

	}
}

原文:

The i and r variables are formatted twice: the first time using code in an overload of print, the second time by conversion code automatically generated by the Java compiler,which also utilizes toString You can format any value this way, but you don't have much control over the results.

译文:

变量i和r被格式化两次,第一次使用在一个print的重载中

第二次使用在使用了tostring方法的java编译器生成的的自动转换代码中

通过这种方式你可以格式化任何值,但是你对结果没有任何控制权(重点是你对格式化的结果没有控制权)。

Format方法

原文:

The format method formats multiple arguments based on a format string. The format string consists of static text embedded with format specifiers; except for the format specifiers, the format string is output unchanged.

译文:

format方法基于格式化的字符串格式化多个参数。 格式字符串由嵌入了格式说明符的静态文本组成。

除格式说明符外,格式字符串的输出保持不变。(简单点,格式符号起到占位的作用,其他的字符正常输出)

格式字符串支持许多功能。 在本教程中,我们将仅介绍一些基础知识。 有关完整说明,请参阅API规范中的格式字符串语法。

Format案例:

package ff;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Locale;
import java.util.Scanner;

public class CopyCytes {

	public static void main(String[] args) throws IOException {

		int i=2;
		double r=Math.sqrt(i);

		System.out.format("The square root of %d is %f.%n", i,r);

	}
}

Like the three used in this example, all format specifiers begin with a % and end with a 1- or 2-character conversion that specifies the kind of formatted output being generated. The three conversions used here are://所有格式说明符都以%开头,并以1或2个字符的转换结尾,该转换指定要生成的格式化输出的种类

注意:

除%%和%n外,所有格式说明符必须与参数匹配。 如果没有,则抛出异常。

原文:

In the Java programming language, the \n escape always generates the linefeed character (\u000A). Don't use \n unless you specifically want a linefeed character. To get the correct line separator for the local platform, use %n.

译文:

在Java编程语言中,\ n转义始终生成换行符(\ u000A)。 除非特别需要换行符,否则请勿使用\ n。 要为本地平台获取正确的行分隔符,请使用%n。(这里的言外之意是,一个是生成转义字符,一个是格式化占位符,两者有本质区别,虽然在程序中看起来实现了一样的效果。)

以上这篇java自定义Scanner类似功能类的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java实现简单控制台通讯录

    通过主菜单对各级子菜单进行控制,并实现添加记录,查找记录,删除记录,修改记录,排序记录,以及退出系统功能的实现.一共六部分的功能模块. 上面的图就是每个模块具有的功能,而且还用到了正则表达式判断输入的是否符合规则,这个系统体现了MVC的设计模式,分工调用很清晰. 主要包含了下面几个类: APP类:程序的主函数类,程序开始的入口 Menu类:里面都是简单页面显示的效果,没有功能的实现. TelNoteRegex类:正则表达式,判断是否输入合格,都在这个方法中. Operate类:业务逻辑类,全部功

  • Java Scanner类的使用示例

    1 Scanner的使用 JDK给我们提供了成千上万个类供我们直接使用,而Scanner就是这众多类里的一个最常用的一个类,既然它是一个类,我们使用它的方法和使用我们自己写的类的方法基本一致. 方法基本如下: 1.导包:就是指出需要使用的类在哪一个位置,格式一般为import 包名称.类名称,Scanner导包语句便为import java.util.Scanner对于和当前类属于同一个包的时候,导包语句可以不写,JDK里提供的类仅仅只有java.lang下的类不需要导包. 2.创建:按照格式创

  • java 使用Scanner类接收从控制台输入的数据方式

    接收从控制台输入的数据可以使用Scanner类实现,Scanner类在一个名为util的包中 需要在程序中导入这个包, 即在程序中添加 import java.util.*; Scanner类可以接收int string char boolean 等类型数据,其中string类型数据使用next() 或者 nextLine() 方法接收 使用方法如下: //首先创建一个Scanner的对象 Scanner scanner = new Scanner(System.in); //定义一个变量,调用

  • Java中接收键盘输入的三种方法

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; public class EnterTest { public static void main(String[] args) { //主方法 CharTest(); //调用System.in方法 ReadTest(); //调用ReadTest方法 Scan

  • java自定义Scanner类似功能类的实例讲解

    读取键盘输入 package com.zjx.io; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * 面试题 * 读取键盘各个数据类型 * */ public class TestFaceIo { public static void main(String[] args) { System.out.print("请输入姓名: "); S

  • Java 中DateUtils日期工具类的实例详解

    Java 中DateUtils日期工具类的实例详解 介绍 在java中队日期类型的处理并不方便,通常都需要借助java.text.SimpleDateFormat类来实现日期类型 和字符串类型之间的转换,但是在jdk1.8之后有所改善,jdk1.7以及之前的版本处理日期类型并不方便, 可以借助Joda Time组件来处理,尤其是日期类型的一些数学操作就更是不方便. java代码 /** * * 日期工具类 java对日期的操作一直都很不理想,直到jdk1.8之后才有了本质的改变. * 如果使用的

  • java中封装JDBC工具类的实例分析

    对于能够重复使用的代码,我们最好的方法是对它们进行封装,然后在下次使用的使用就可以直接调用了.本篇所要提到的是JDBC工具类,相信大家在学习java时都接触过.那么对于封装它的方法,本篇先对工具类进行简单的说明,列出有关的封装步骤,然后带来相关的实例. 1.说明 在java开发过程中,代码中时常用到一些Scanner.Random一样的类,他们是键盘录入,生成随机数的类,像一个工具一样,在java中被称为工具类. 2.步骤 封装JDBC工具类 加入获取数据库连接对象的方法 加入释放连接的方法 3

  • Python自定义元类的实例讲解

    1.说明 一个类没有声明自己的元类,默认他的元类就是type,除了使用元类type,用户也可以通过继承type来自定义元类. 2.实例 我们可以使用类属性 __metaclass__ 把一个类的创建过程,转交给其它地方. class A(object): __metaclass__ = ... # 这个类的创建转交给其他地方 pass 先定义了类 A,然后定义了一个类属性 __metaclass__,这个属性表示创建类 A 的过程,转交给其它地方处理. 类属性 __metaclass__ 可以是

  • Java实现Web应用中的定时任务(实例讲解)

    定时任务,是指定一个未来的时间范围执行一定任务的功能.在当前WEB应用中,多数应用都具备任务调度功能,针对不同的语音,不同的操作系统, 都有其自己的语法及解决方案,windows操作系统把它叫做任务计划,linux中cron服务都提供了这个功能,在我们开发业务系统中很多时候会涉及到这个功能.本场chat将使用java语言完成日常开发工作中常用定时任务的使用,希望给大家工作及学习带来帮助. 一.定时任务场景 (1)驱动处理工作流程 作为一个新的预支付订单被初始化放置,如果该订单在指定时间内未进行支

  • 基于Socket类以及ServerSocket类的实例讲解

    Socket类 套接字是网络连接的端点,套接字使应用可以从网络中读取数据,可以向网络中写入数据.不同计算机上的两个应用程序可以通过连接发送或接收字节流,以此达到相互通信的目的. 为了从一个应用程序向另一个应用程序发送消息,需要知道另一个应用程序中套接字的 IP 地址和端口号,在java中,套接字由java.net.Socket 表示. 要创建一个套接字,可以使用Socket类中众多构造函数中的一个.其中一个构造函数接收两个参数:主机号和端口号. public Socket (String hos

  • java中volatile不能保证线程安全(实例讲解)

    今天打了打代码研究了一下java的volatile关键字到底能不能保证线程安全,经过实践,volatile是不能保证线程安全的,它只是保证了数据的可见性,不会再缓存,每个线程都是从主存中读到的数据,而不是从缓存中读取的数据,附上代码如下,当synchronized去掉的时候,每个线程的结果是乱的,加上的时候结果才是正确的. /** * * 类简要描述 * * <p> * 类详细描述 * </p> * * @author think * */ public class Volatil

  • Java自动化测试中多数据源的切换(实例讲解)

    在做自动化测试时,数据驱动是一个很重要的概念,当数据与脚本分离后,面对茫茫多的数据,管理数据又成了一个大问题,而数据源又可能面对多个,就跟在开发过程中,有时候要连接MYSQL,有时候又要连接SQL SERVER一样,如何做到快速切换?下面的示例中,我们将从一个数据源开始,一步步的演示下去: 一. 用外部文件做数据驱动的基本写法 1.1 我们在做数据驱动时,把数据存储在JAVA的属性文件中:data.properties username=test password=123456 1.2 解析pr

  • java求两个数中的大数(实例讲解)

    java中的max函数在Math中 应用如下: int a=34: int b=45: int ans=Math.max(34,45); 那么ans的值就是45. 以上这篇java求两个数中的大数(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Java 选择、冒泡排序、折半查找(实例讲解)

    如下所示: //选择排序对数据进行升序排序 public static void selectSortArray(int[] arr){ for(int i = 0; i<arr.length-1;i++){ for(int j = i+1;j<arr.length;j++){ if(arr[i]>arr[j]){ int temp = arr[j]; arr[j] = arr[i]; arr[i] = temp; } } } } //冒泡排序对数据进行升序排序 public stati

随机推荐