跳到主要内容Java 包与导包机制及 Scanner 类输入源详解 | 极客日志Javajava
Java 包与导包机制及 Scanner 类输入源详解
本文详细介绍了 Java 语言中包(Package)的定义、作用及命名规范,阐述了 import 语句的多种导入方式及静态导入概念。同时深入讲解了 Scanner 类的功能特性,包括如何从标准输入、文件或字符串读取数据,并列举了常用的输入读取与校验方法,帮助读者掌握 Java 基础输入处理机制。
1. 包
1.1 什么是包?
举个例子,你和你的同学有不同的家庭,你们都有自己的爸爸妈妈,都有自己的家。在自己的家中你们可以按照自己爱好摆放东西,都互不干扰。但是,假如你们的家都在一起,你们就不能按照自己的喜好摆放东西了,你们之间会相互影响。
为了让每个程序之间直接有相对好的隔离,就设置了包。包其实就是一个串文件夹,在不同的文件夹中可以设置相同的名字的文件。
1.2 包的主要作用
包(Package)是一种将类和接口组织在一起的机制。
- 命名空间管理
包提供了一种命名空间管理机制,避免类名冲突。通过将类放在不同的包中,可以确保类名的唯一性。例如,多个项目中可能会有多个名为 Logger 的类,但通过将它们放在不同的包中,可以避免命名冲突。
- 访问控制
包还提供了访问控制机制。通过使用不同的访问修饰符(如 public、protected、默认(即不写访问修饰符)和 private),可以控制类、方法和变量的可见性。例如,一个类的成员可以对同一个包中的其他类可见,但对其他包中的类不可见。
- 代码组织
包有助于将相关的类和接口组织在一起,使代码更易于管理和维护。通常,一个包会包含一组具有相似功能或用途的类和接口。例如,java.util 包包含了各种实用工具类,如 List、Map、Set 等。
1.3 src 文件
src 文件夹(或目录)通常代表'source'的缩写,用于存放项目的源代码文件。这个文件夹是项目的核心部分,包含了所有的业务逻辑、类定义、函数实现等代码文件。
项目的标准目录结构如下:

子文件夹组织:
src 文件夹通常会进一步细分为多个子文件夹,以更好地组织代码。
例如:
main/java:存放主要的 Java 源代码文件。
main/resources:存放资源文件,如配置文件、静态文件等。
test/java:存放测试代码文件。
test/resources:存放测试资源文件。
1.4 创建包
包时在 src 文件下创建的

接着创建包

包名通常是小写的,并且通常使用公司域名的逆序来命名,以确保全局唯一性。
把图片中的 package_name 改为:com.example.myapp
这个包名 com.examplemyapp 是一个文件的名字吗?
我们看一下 文件的有没有 文件
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- Keycode 信息
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
- Escape 与 Native 编解码
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
- JavaScript / HTML 格式化
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
- JavaScript 压缩与混淆
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
src
com.example.myapp
在 src 文件夹中只有 com 文件夹,没有 com.example.myapp 文件,其实.把包的名字分隔了,分割成三个镶嵌的文件夹。
在 com.example.myapp 文件夹中创建 Myclass 类
在 Java 源文件的顶部,使用 package 关键字来指定包名。
2. 导包
2.1 什么是导包?
'导包'指的是使用 import 语句将一个类或接口从一个包中引入到当前的编译单元中,以便在代码中可以直接使用这些类或接口,而不需要每次都写完整的类名或接口名。
- 简化代码:
导包可以让你在代码中直接使用类或接口的简单名称,而不是完整的类名或接口名。这使得代码更简洁、易读。
例如,java.util.ArrayList 可以简化为 ArrayList。
- 避免命名冲突:
当两个不同的包中有同名的类或接口时,通过导包可以明确指定你使用的是哪个包中的类或接口。
例如,java.util.Date 和 java.sql.Date 都有 Date 类,通过导包可以区分它们。
2.2 导包的语法
import package_name.ClassName;
package_name:包的名子。
ClassName:类的名字。
package_name:包的名子。
*:表示该包下的所有类
静态导入(Java 5 及以上):
静态导入允许你直接使用类中的静态成员(如静态方法和静态字段),而不需要类名前缀。
import static package_name.ClassName.staticMember;
static 关键字:表示静态导入。
package_name:包的名子。
ClassName:类的名字。
staticMember:类中静态成员变量或静态方法。
整个包的导入,使用 ArrayList 和 HashMap 类
import java.util.*;
public class InOut {
public static void main(String[] args) {
ArrayList<String> arr = new ArrayList<>();
arr.add("Hello");
arr.add("World");
System.out.println(arr);
HashMap<String, Integer> map = new HashMap<>();
map.put("One", 1);
map.put("Two", 2);
System.out.println(map);
}
}
ArrayList 和 HashMap 是 java.util 包中的两个类
import java.util.ArrayList;
public class InOut {
public static void main(String[] args) {
ArrayList<String> arr = new ArrayList<>();
arr.add("Hello");
arr.add("World");
System.out.println(arr);
}
}
ArrayList 是 java.util 包中的泛型类,是一个动态数组。
2.3 习题
A. 包是一组类的集合
B. 包能防止类的名字冲突
C. import 语句能够导入一个指定的包
D. import static 能够导入一些静态方法
import java.util.Arrays;
import java.util;
import java.util.*;
第 1 行导入的是具体的包中的类。
第 2 行报错,不能导入指定包。
第 3 行导入的是包下的所有类,用到这个包底下哪个类就回调用哪个。
3. Scanner 类
3.1 什么是 Scanner 类?
我们人与人之间的交流一般都是通过对话,但是我们怎么与程序进行对话呢?
Scanner 类是 Java 标准库中的一个实用工具类,用于从标准输入(通常是键盘输入)或其他输入源(如文件或字符串)读取不同类型的输入数据。Scanner 类提供了多种方法来读取和解析不同类型的数据,如整数、浮点数、字符串等。
- 输入源多样:Scanner 可以从多种输入源读取数据,包括标准输入、文件、字符串等。
- 类型丰富:Scanner 支持读取多种数据类型,如 int、double、String 等。
- 分隔符灵活:Scanner 使用分隔符(默认为空白字符,包括空格、制表符、换行符等)来分隔输入数据,但也可以自定义分隔符。
- 简单易用:Scanner 提供了丰富的 API,使得读取和解析输入数据变得非常简单。
3.2 创建一个 scanner 对象
Scanner 类在 java.util 包中,使用 Scanner 需要调包。
示例:
import java.util.Scanner;
public class InOut {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的名字");
String s = sc.next();
System.out.println("请输入您的年龄");
int n = sc.nextInt();
System.out.println(s + "年龄是:" + n + "岁");
sc.close();
}
}
同学们可以发现,创建 Scanner 对象的时传入了一个参数 System.in,为什么要传参呢?
在创建 Scanner 对象时传递 System.in 参数是为了指定输入源。System.in 是一个标准输入流,通常用于从键盘读取用户输入。通过传递 System.in 给 Scanner 构造函数,你可以让 Scanner 从标准输入(即键盘)读取数据。
3.3 输入源
文件输入:
从文件读取数据时,可以传递一个 File 对象给 Scanner 构造函数。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
try {
File file = new File("input.txt");
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println(line);
}
scanner.close();
} catch (FileNotFoundException e) {
System.out.println("文件未找到!");
e.printStackTrace();
}
}
}
字符串输入:
从字符串读取数据时,可以传递一个 String 对象给 Scanner 构造函数。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
String input = "100 200 300";
Scanner scanner = new Scanner(input);
while (scanner.hasNextInt()) {
int number = scanner.nextInt();
System.out.println(number);
}
scanner.close();
}
}
标准输入 (System.in):
System.in 是一个 InputStream 对象,表示标准输入流,通常是从键盘输入的数据。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入您的名字:");
String name = scanner.nextLine();
System.out.println("你好," + name);
scanner.close();
}
}
4. Scanner(System.in) 常用的方法
4.1 读取数值
| 方法名 | 描述 |
|---|
next() | 读取下一个 token(默认以空白字符分隔)。 |
nextLine() | 读取下一行(字符串)。 |
nextInt() | 读取下一个整数。 |
nextDouble() | 读取下一个双精度浮点数。 |
nextBoolean() | 读取下一个布尔值。 |
nextByte() | 读取下一个字节。 |
nextShort() | 读取下一个短整数。 |
nextLong() | 读取下一个长整数。 |
nextFloat() | 读取下一个单精度浮点数。 |
nextLine():nextLine() 会读取包括空格在内的所有字符,直到遇到换行符\n为止。
next():next() 方法读取输入中的下一个 token,并返回一个字符串。一个 token 是由空白字符分隔的一段连续的字符序列。默认的分隔符是空白字符,包括空格( )、制表符(\t)、换行符(\n)、回车符(\r)等。例如,输入字符串 'Hello World' 会被 next() 方法分成两个 token:'Hello' 和 'World'。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入您的名字:");
String name = scanner.nextLine();
System.out.println("你好," + name);
System.out.print("请输入您的爱好(用空格分隔):");
String hobbies = scanner.next();
System.out.println("你的爱好是:" + hobbies);
System.out.print("请输入您的年龄:");
int age = scanner.nextInt();
System.out.println("你的年龄是:" + age);
System.out.print("请输入您的身高(米):");
double height = scanner.nextDouble();
System.out.println("你的身高是:" + height + " 米");
scanner.close();
}
}
4.2 检查输入
在使用 Scanner 类读取输入时,检查输入的作用非常重要。这些检查方法可以帮助你在读取数据之前验证输入的类型和格式,从而避免潜在的运行时错误和异常。
| 方法 | 描述 |
|---|
hasNext() | 检查是否还有下一个 token(默认以空白字符分隔)。 |
hasNextLine() | 检查是否还有下一行。 |
hasNextInt() | 检查是否还有下一个整数。 |
hasNextDouble() | 检查是否还有下一个双精度浮点数。 |
hasNextFloat() | 检查是否还有下一个单精度浮点数。 |
hasNextLong() | 检查是否还有下一个长整数。 |
hasNextByte() | 检查是否还有下一个字节。 |
hasNextShort() | 检查是否还有下一个短整数。 |
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个整数:");
if (scanner.hasNextInt()) {
int number = scanner.nextInt();
System.out.println("你输入的整数是:" + number);
} else {
System.out.println("输入的不是整数!");
scanner.next();
}
scanner.close();
}
}