(一):如何接收输入的参数,并且如何输出

第一种: 使用 Scanner 类进行输入,System.out.println() 进行输出


import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;

public class ScannerExample {
    public static void main(String[] args) {
        // 创建 Scanner 对象,用于从标准输入流(键盘)读取数据
        Scanner scanner = new Scanner(System.in);

        System.out.print("请输入一个单词(以空白字符分隔):");
        // 1.读取一个单词(以空白字符分隔)
        String s = scanner.next();
        // 消耗掉 next() 之后的换行符
        scanner.nextLine();

        System.out.print("请输入包含空格的名字:");
        // 2.读取一整行字符串
        String name = scanner.nextLine();

        System.out.print("请输入你的年龄(范围 -2147483648 到 2147483647):");
        // 3.读取一个整数,范围是 -2^31 到 2^31 - 1
        int age = scanner.nextInt();

        System.out.print("请输入你的体重:");
        // 4.读取一个双精度浮点数,范围大约是 ±4.9e-324 到 ±1.7976931348623157e+308
        double weight = scanner.nextDouble();

        System.out.print("你是否已婚(true 或 false):");
        // 5.读取一个布尔值
        boolean isMarried = scanner.nextBoolean();

        System.out.print("请输入你的性别(单个字符):");
        // 6.读取一个字符
        char gender = scanner.next().charAt(0);

        System.out.print("请输入一个字节数(范围 -128 到 127):");
        // 7.读取一个字节类型的整数
        byte b = scanner.nextByte();

        System.out.print("请输入一个长整数(范围 -9223372036854775808 到 9223372036854775807):");
        // 8.读取一个长整型整数,范围是 -2^63 到 2^63 - 1
        long l = scanner.nextLong();

        System.out.print("请输入一个大精度数:");
        // 9.读取一个任意精度的大精度数,范围取决于你的内存
        BigDecimal bigDecimal = scanner.nextBigDecimal();

        System.out.print("请输入一个大整数:");
        // 10.读取一个任意精度的大整数,范围取决于你的内存
        BigInteger bigInteger = scanner.nextBigInteger();

        // 关闭 Scanner 对象,释放资源
        scanner.close();

        // 输出读取到的数据
        System.out.println("\n你输入的信息如下:");
        System.out.println("单词: " + s);
        System.out.println("包含空格的名字: " + name);
        System.out.println("年龄: " + age);
        System.out.println("体重: " + weight);
        System.out.println("是否已婚: " + isMarried);
        System.out.println("性别: " + gender);
        System.out.println("字节数: " + b);
        System.out.println("长整数: " + l);
        System.out.println("大精度数: " + bigDecimal);
        System.out.println("大整数: " + bigInteger);
    }
}

输入:
请输入一个单词(以空白字符分隔):a vb
请输入包含空格的名字:a vb
请输入你的年龄(范围 -2147483648 到 2147483647):15
请输入你的体重:52
你是否已婚(true 或 false):true
请输入你的性别(单个字符):男
请输入一个字节数(范围 -128 到 127):97
请输入一个长整数(范围 -9223372036854775808 到 9223372036854775807):625215
请输入一个大精度数:1111111111111111111111111111111111111111111111111111111111111111111111111
请输入一个大整数:99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

输出
你输入的信息如下:
单词: a
包含空格的名字: a vb
年龄: 15
体重: 52.0
是否已婚: true
性别: 男
字节数: 97
长整数: 625215
大精度数: 1111111111111111111111111111111111111111111111111111111111111111111111111
大整数: 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

 注意:只需要掌握比较重要的几个,比如next,nextLine,nextInt,nextDouble,nextLong,其余的后面再说

优点
  • 使用简单:Scanner 类提供了许多方便的方法,如 nextInt()、nextDouble()、nextLine() 等,可以轻松读取不同类型的数据。
  • 适用性强:对于小规模的输入和简单的竞赛题目,Scanner 类可以满足大多数需求。
缺点
  • 效率较低:Scanner 类在处理大量输入时,由于其内部的缓冲机制和数据解析方式,会导致性能下降。
  • 异常处理复杂:在使用 Scanner 类时,如果输入格式不符合要求,可能会抛出 InputMismatchException 等异常,需要进行额外的异常处理。

第二种:使用 BufferedReader 进行输入,System.out.println() 进行输出


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BufferedReaderWithSystemOut {
    public static void main(String[] args) throws IOException {
        // 创建 BufferedReader 对象
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("请输入一些字符:");
        int c;
        /**读取字符,该代码会持续读取用户输入的字符,
         直到输入结束(比如在控制台按下 Ctrl + D 组合键),并将读取到的字符逐个输出。
         适合处理不知道输入的字符数时
         */
        while ((c = reader.read()) != -1) {
            System.out.print((char) c);
        }
    }
}

 请输入一些字符:
123456789        //这一行是输入,
123456789        //这一行是输出
如果数据量大,不知道多少个,就可以用这个来接收,最后判断是否还有流(也就是输入),当达到流的末尾时,返回-1,这种输入效率高

重点重点重点!!! 必须抛出异常或者try catch处理异常

下面我们再来探究一下readLine和nextLine


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

public class M {
    public static void main(String[] args) throws IOException {
        // 创建 Scanner 对象来读取输入
        Scanner scanner = new Scanner(System.in);
        // 创建 BufferedReader 对象来读取输入
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        /**
         * 从输入流读取一行文本,直到遇到换行符(\n)、回车符(\r)或者回车换行符(\r\n)为止。
         读取到的内容会作为一个字符串返回,并且不包含换行符。
         */
        String str = reader.readLine();
        String s2 = reader.readLine();
        System.out.println("你输入的字符串是: " + str+ " "+s2);

        int num = scanner.nextInt(); // 读取整数,但留下换行符(\n)
        //scanner.nextLine();// 读取换行符,并丢弃它
        String line = scanner.nextLine(); //此时 line 会读取到空字符串(因为换行符已被遗留)
        System.out.println("你输入的整数是: " + num+ " "+line);

        reader.close();
        scanner.close();
    }
}

输入与输出

1 2 3
3 2 1
你输入的字符串是: 1 2 3 3 2 1
12
你输入的整数是: 12 

Process finished with exit code 0

注意:我们发现,最后一行我们还没有输入完,就已经退出了,这就是因为nextInt()不处理换行符,而nextLine遇到了换行符就进行输出,没有等到真正的输入;

但是readLine则不需要进行处理换行符,它本质是已经读入换行符,但是并没有返回换行符,nextLine也不需要进行处理换行符,但是速度没有readLine快,所以我们在面临大数据输入时选择readLine;

优点
  • 输入效率高:BufferedReader使用缓冲机制,减少了与输入流的交互次数,提高了输入效率,适合处理大量的输入数据。
  • 输出方便:System.out.println()是 Java 中最常用的输出方法,使用简单,易于理解。
缺点
  • 数据类型处理复杂:BufferedReader读取的数据都是字符串类型,需要手动进行数据类型转换,增加了代码的复杂度。
  • 异常处理繁琐:在使用BufferedReader时,需要处理IOException异常,而在进行数据类型转换时,还需要处理NumberFormatException异常。

 (二):printf格式化输出

基本格式

格式说明符的基本格式如下:

%[标志][宽度][.精度]转换字符

转换字符

转换字符决定了要格式化的数据类型和输出格式,下面是一些常见的转换字符:

1. 整数类型
  • d:以十进制整数形式输出。
int num = 123;
System.out.printf("十进制整数: %d\n", num); 
  • o:以八进制整数形式输出。
int num = 123;
System.out.printf("八进制整数: %o\n", num); 
  • x 或 X:以十六进制整数形式输出,x 输出小写字母,X 输出大写字母。
int num = 123;
System.out.printf("十六进制整数(小写): %x\n", num); 
System.out.printf("十六进制整数(大写): %X\n", num); 
2. 浮点数类型
  • f:以十进制浮点数形式输出。
double d = 3.14159;
System.out.printf("十进制浮点数: %f\n", d); 
  • e 或 E:以科学计数法形式输出,e 输出小写字母 e,E 输出大写字母 E。
double d = 3.14159;
System.out.printf("科学计数法(小写): %e\n", d); 
System.out.printf("科学计数法(大写): %E\n", d); 
  • g 或 G:根据数值大小自动选择 f 或 e 格式,g 输出小写字母,G 输出大写字母。
double d = 3.14159;
System.out.printf("自动选择格式(小写): %g\n", d); 
System.out.printf("自动选择格式(大写): %G\n", d); 
3. 字符串类型
  • s:以字符串形式输出。
String str = "Hello";
System.out.printf("字符串: %s\n", str); 
4. 字符类型
  • c:以字符形式输出。
char ch = 'A';
System.out.printf("字符: %c\n", ch); 
5. 布尔类型
  • b 或 B:以布尔值形式输出,b 输出小写字母,B 输出大写字母。
boolean flag = true;
System.out.printf("布尔值(小写): %b\n", flag); 
System.out.printf("布尔值(大写): %B\n", flag); 
6. 百分比和换行符
  • %:输出百分号 %。
System.out.printf("百分比: 50%%\n"); 
  • n:输出换行符。
System.out.printf("第一行%n第二行\n"); 

标志

标志用于控制输出的一些特性,下面是一些常见的标志:

1. -:左对齐输出。
int num = 123;
System.out.printf("左对齐: %-10d\n", num); 
2. +:对于正数显示正号 +。
int num = 123;
System.out.printf("显示正号: %+d\n", num); 
3. 0:用零填充输出。
int num = 123;
System.out.printf("零填充: %010d\n", num); 
4. (空格):对于正数在前面添加一个空格。
int num1 = 123;
int num2 = -123;
System.out.printf("正数加空格: % d\n", num1); 
System.out.printf("负数不加空格: % d\n", num2); 
5. #:对于八进制和十六进制输出,在前面添加 0 或 0x。
int num = 123;
System.out.printf("八进制加前缀: %#o\n", num); 
System.out.printf("十六进制加前缀: %#x\n", num); 

宽度

宽度指定了输出的最小字符数,如果输出的字符数小于宽度,则会在前面(或后面,取决于是否使用 - 标志)填充空格或零。

int num = 123;
System.out.printf("宽度为 10: %10d\n", num); 

精度

精度对于不同的转换字符有不同的含义:

  • 对于浮点数类型,精度指定了小数点后的位数。
double d = 3.14159;
System.out.printf("保留两位小数: %.2f\n", d); 
  • 对于字符串类型,精度指定了输出的最大字符数。
String str = "Hello World";
System.out.printf("最多输出 5 个字符: %.5s\n", str); 

下一站:数组

数组学习

更多推荐