Java作为一种广泛使用的编程语言,数组是其基础且重要的数据结构之一,掌握如何在Java中“键入”(即输入或初始化)数组,是进行数据处理、算法实现的前提,本文将从基础概念出发,详细讲解Java中数组的多种输入方式,包括控制台输入、文件输入、代码直接初始化等,并辅以示例代码和注意事项,帮助读者全面理解Java数组的输入操作。

Java数组基础概念
在讨论数组输入之前,需明确数组的核心特性:数组是一种固定长度的、存储同类型数据的线性集合,其元素通过索引(从0开始)访问。int[] arr表示一个整数数组,String[] names表示字符串数组,Java中数组的声明方式有两种:数据类型[] 数组名(推荐)或数据类型 数组名[],声明后需初始化才能使用。
控制台输入数组
控制台输入是Java中最常见的交互方式,通过Scanner类读取用户输入的数据并存入数组,根据数据类型和输入格式的不同,可分为以下几种场景:
固定长度数组的输入
若数组长度已知,可通过循环逐个读取输入元素,输入一个长度为5的整数数组:
import java.util.Scanner;
public class ArrayInput {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入数组长度: ");
int length = scanner.nextInt(); // 读取数组长度
int[] arr = new int[length]; // 初始化数组
System.out.println("请输入" + length + "个整数,用空格分隔: ");
for (int i = 0; i < length; i++) {
arr[i] = scanner.nextInt(); // 逐个读取元素
}
System.out.print("输入的数组为: ");
for (int num : arr) {
System.out.print(num + " ");
}
scanner.close();
}
}
关键点:
- 先通过
scanner.nextInt()读取数组长度,再创建对应长度的数组。 - 使用
for循环遍历数组,通过scanner.nextInt()为每个元素赋值。 - 输入时需确保数据类型与数组类型一致,否则会抛出
InputMismatchException。
动态长度数组的输入(基于输入流)
若输入数据长度不固定(如用户输入未知数量的数字),可结合List和数组转换实现:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class DynamicArrayInput {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
List<Integer> list = new ArrayList<>();
System.out.println("请输入多个整数,输入非数字字符结束: ");
while (scanner.hasNextInt()) { // 检查下一个输入是否为整数
list.add(scanner.nextInt());
}
int[] arr = list.stream().mapToInt(i -> i).toArray(); // List转数组
System.out.print("输入的数组为: ");
for (int num : arr) {
System.out.print(num + " ");
}
scanner.close();
}
}
关键点:
- 使用
ArrayList动态存储输入数据,避免固定长度数组的局限性。 - 通过
scanner.hasNextInt()判断输入是否为整数,遇非数字字符时终止输入。 - 利用Java 8的Stream API将
List转换为数组(toArray())。
字符串数组的输入
字符串数组的输入与整数数组类似,但需使用nextLine()或next()方法:
import java.util.Scanner;
public class StringArrayInput {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入字符串数量: ");
int n = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
String[] names = new String[n];
System.out.println("请输入" + n + "个字符串,每行一个: ");
for (int i = 0; i < n; i++) {
names[i] = scanner.nextLine(); // 读取整行字符串
}
System.out.print("输入的字符串数组为: ");
for (String name : names) {
System.out.print(name + " ");
}
scanner.close();
}
}
注意事项:

- 在
nextInt()后使用nextLine()时,需额外调用一次nextLine()消耗缓冲区中的换行符(\n),否则会导致下一行输入被跳过。
文件输入数组
当数据量较大或需要持久化存储时,可通过读取文件内容初始化数组,假设文件data.txt中每行存储一个数字(或逗号分隔的数字),可通过BufferedReader或Scanner读取文件:
逐行读取文件并转为整数数组
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class FileArrayInput {
public static void main(String[] args) {
String filePath = "data.txt";
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
List<Integer> list = new ArrayList<>();
while ((line = reader.readLine()) != null) {
list.add(Integer.parseInt(line.trim())); // 去除空格后转为整数
}
int[] arr = list.stream().mapToInt(i -> i).toArray();
System.out.print("从文件读取的数组为: ");
for (int num : arr) {
System.out.print(num + " ");
}
} catch (IOException e) {
System.err.println("文件读取失败: " + e.getMessage());
} catch (NumberFormatException e) {
System.err.println("数据格式错误: " + e.getMessage());
}
}
}
关键点:
- 使用
try-with-resources自动关闭BufferedReader,避免资源泄漏。 - 通过
readLine()逐行读取文件,trim()去除字符串首尾空格,Integer.parseInt()转为整数。 - 捕获
IOException(文件不存在、读取失败)和NumberFormatException(数据非数字)异常。
读取CSV格式的数组
若文件中数据以逗号分隔(如1,2,3,4,5),可通过split()方法分割字符串:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class CSVArrayInput {
public static void main(String[] args) {
String filePath = "data.csv";
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line = reader.readLine();
if (line != null) {
String[] strArr = line.split(","); // 按逗号分割
int[] arr = new int[strArr.length];
for (int i = 0; i < strArr.length; i++) {
arr[i] = Integer.parseInt(strArr[i].trim());
}
System.out.print("从CSV读取的数组为: ");
for (int num : arr) {
System.out.print(num + " ");
}
}
} catch (IOException | NumberFormatException e) {
System.err.println("处理文件时出错: " + e.getMessage());
}
}
}
代码直接初始化数组
除外部输入外,Java还支持在代码中直接初始化数组,适用于已知数据值的场景:
静态初始化
声明数组时直接赋值,由系统自动计算数组长度:
int[] arr1 = {1, 2, 3, 4, 5}; // 整数数组
String[] arr2 = {"Java", "Python", "C++"}; // 字符串数组
double[] arr3 = {3.14, 2.71, 1.618}; // 浮点数数组
动态初始化
先声明数组长度,再通过索引或循环赋值:
int[] arr = new int[3]; // 声明长度为3的数组
arr[0] = 10; // 通过索引赋值
arr[1] = 20;
arr[2] = 30;
// 或通过循环赋值
for (int i = 0; i < arr.length; i++) {
arr[i] = i * 10;
}
多维数组的输入
多维数组是数组的数组,如二维数组可表示矩阵,其输入方式需结合嵌套循环:
二维数组的控制台输入
import java.util.Scanner;
public class MatrixInput {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入矩阵的行数和列数(空格分隔): ");
int rows = scanner.nextInt();
int cols = scanner.nextInt();
int[][] matrix = new int[rows][cols];
System.out.println("请输入矩阵元素(按行输入,用空格分隔): ");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matrix[i][j] = scanner.nextInt();
}
}
System.out.println("输入的矩阵为: ");
for (int[] row : matrix) {
for (int num : row) {
System.out.print(num + "\t");
}
System.out.println();
}
scanner.close();
}
}
示例输入:

3 3
1 2 3
4 5 6
7 8 9
输出:
1 2 3
4 5 6
7 8 9
常见错误与解决方案
-
数组索引越界异常(ArrayIndexOutOfBoundsException)
原因:访问数组时索引超出范围(如索引为负数或≥数组长度)。
解决:确保循环条件为i < arr.length,访问前检查索引有效性。 -
输入类型不匹配异常(InputMismatchException)
原因:如数组类型为int,但输入了字符串。
解决:使用scanner.hasNextInt()等方法预检查输入类型,或通过try-catch捕获异常并提示用户重新输入。 -
换行符残留问题
原因:nextInt()后未消耗换行符,导致nextLine()直接读取空行。
解决:在nextInt()后调用nextLine()一次,或统一使用nextLine()读取整行后手动解析。
Java中数组的输入方式多样,需根据场景选择合适的方法:
- 控制台输入:适用于交互式程序,通过
Scanner类读取用户输入,需注意数据类型匹配和换行符处理。 - 文件输入:适用于大规模数据或持久化需求,通过
BufferedReader或Scanner读取文件,需处理异常和格式解析。 - 代码初始化:适用于已知数据值的场景,静态初始化简洁,动态初始化灵活。
- 多维数组输入:通过嵌套循环处理,适用于矩阵、表格等结构化数据。
掌握这些方法后,可灵活应对Java开发中数组输入的各种需求,为后续数据处理和算法实现奠定基础,在实际编程中,还需注意代码的健壮性,通过异常处理和输入验证确保程序稳定运行。









