在 Java 编程中,字符串作为一种核心的数据类型,其读取操作是开发过程中极为常见的需求,无论是处理用户输入、解析配置文件,还是处理网络传输的数据,都离不开对字符串的读取,本文将系统地介绍 Java 中读取字符串的多种方式,涵盖从基础的控制台输入到高级的文件读取、网络数据读取等场景,并分析各种方法的适用场景与最佳实践。

控制台输入读取字符串
控制台输入是 Java 程序与用户交互最直接的方式,主要用于命令行应用程序的开发,Java 提供了多种类来实现控制台字符串的读取,其中最常用的是 Scanner 类和 BufferedReader 类。
使用 Scanner 类读取字符串
Scanner 类是 Java 5 引入的一个功能强大的工具,位于 java.util 包中,不仅支持读取字符串,还能读取基本数据类型,它提供了 next() 和 nextLine() 两个核心方法来读取字符串。
next():读取输入的下一个单词(以空格、Tab 或换行符为分隔符),读取时会跳过空白字符。nextLine():读取输入的一整行,直到遇到换行符为止,包含行中的所有字符(包括空格)。
示例代码:
import java.util.Scanner;
public class ConsoleInputExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个单词:");
String word = scanner.next();
System.out.println("读取的单词:" + word);
System.out.print("请输入一行文本:");
scanner.nextLine(); // 消费换行符
String line = scanner.nextLine();
System.out.println("读取的行:" + line);
scanner.close();
}
}
注意事项:Scanner 的 next() 和 nextLine() 连续使用时,需注意缓冲区中残留的换行符问题,通常可以通过调用 nextLine() 来消费换行符。Scanner 不是线程安全的,在多线程环境下需谨慎使用。
使用 BufferedReader 类读取字符串
BufferedReader 是 Java I/O 包中的一个高效类,它通过缓冲机制减少 I/O 操作次数,提高读取性能,与 Scanner 不同,BufferedReader 只能读取字符流,因此需要结合 InputStreamReader 来读取控制台输入(默认为字节流)。
示例代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BufferedReaderExample {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入一行文本:");
String line = reader.readLine();
System.out.println("读取的行:" + line);
reader.close();
}
}
优点:BufferedReader 的 readLine() 方法一次性读取整行,性能优于 Scanner 的 nextLine(),尤其适合读取大量数据,缺点是需要处理 IOException 异常,且代码相对繁琐。
从文件中读取字符串
文件读取是 Java 开发中的常见需求,无论是读取配置文件、日志文件还是数据文件,都需要掌握字符串读取方法,Java 提供了多种文件读取方式,包括基于字节流、字符流以及 NIO(New I/O)的高效读取方法。
使用 FileReader 和 BufferedReader 读取文件
FileReader 是用于读取文件的字符流类,但每次读取一个字符,效率较低,结合 BufferedReader 可以缓冲字符,提高读取效率。
示例代码:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class FileReadExample {
public static void main(String[] args) {
String filePath = "example.txt";
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.err.println("文件读取失败:" + e.getMessage());
}
}
}
说明:使用 try-with-resources 语句可以自动关闭资源,避免资源泄漏。readLine() 方法返回一行内容(不包含换行符),当到达文件末尾时返回 null。
使用 Files 类(Java 7+)读取文件
Java 7 引入了 java.nio.file 包,其中的 Files 类提供了更简洁的文件操作方法。Files.readAllLines() 方法可以直接读取文件的所有行到 List<String> 中,适用于小文件读取。
示例代码:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public class FilesReadExample {
public static void main(String[] args) {
Path path = Paths.get("example.txt");
try {
List<String> lines = Files.readAllLines(path);
for (String line : lines) {
System.out.println(line);
}
} catch (IOException e) {
System.err.println("文件读取失败:" + e.getMessage());
}
}
}
优点:代码简洁,无需手动关闭资源,缺点是如果文件较大,可能会占用较多内存,此时建议使用 BufferedReader 逐行读取。
使用 Files.readString(Java 11+)读取整个文件
Java 11 新增了 Files.readString() 方法,可以直接将文件内容读取为一个字符串,适用于读取整个小文件。
示例代码:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class FilesReadAllStringExample {
public static void main(String[] args) {
Path path = Paths.get("example.txt");
try {
String content = Files.readString(path);
System.out.println(content);
} catch (IOException e) {
System.err.println("文件读取失败:" + e.getMessage());
}
}
}
适用场景:需要一次性读取整个文件内容并作为字符串处理的场景,如读取配置文件、JSON 数据等。
从网络中读取字符串
在 Java 网络编程中,经常需要从网络连接(如 HTTP 请求、Socket 通信)中读取字符串数据,常见的场景包括调用 RESTful API 接口、接收 Socket 客户端发送的数据等。
使用 HttpURLConnection 读取 HTTP 响应字符串
HttpURLConnection 是 Java 标准库中用于发送 HTTP 请求的类,可以通过它获取服务器的响应数据,并将响应流转换为字符串。
示例代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpReadExample {
public static void main(String[] args) {
String urlString = "https://www.example.com";
try {
URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
StringBuilder response = new StringBuilder();
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
System.out.println("响应内容:" + response.toString());
} catch (IOException e) {
System.err.println("网络请求失败:" + e.getMessage());
}
}
}
说明:需要处理网络异常和 I/O 异常,读取完成后需关闭输入流。
使用 Socket 读取客户端发送的字符串
在 Socket 编程中,服务端可以通过 Socket 的输入流读取客户端发送的字符串数据。
示例代码(服务端):
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServerExample {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(8080)) {
System.out.println("服务端启动,等待客户端连接...");
try (Socket clientSocket = serverSocket.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println("收到客户端消息:" + line);
}
}
} catch (IOException e) {
System.err.println("服务端异常:" + e.getMessage());
}
}
}
说明:readLine() 方法会阻塞,直到客户端关闭连接或发送换行符,服务端需注意关闭 ServerSocket 和 Socket 资源。
总结与最佳实践
在 Java 中读取字符串的方法多种多样,选择合适的方式取决于具体的应用场景:
- 控制台输入:优先使用
Scanner(简单易用)或BufferedReader(性能更高)。 - 文件读取:
- 小文件:
Files.readAllLines()或Files.readString()(Java 11+)。 - 大文件:
BufferedReader逐行读取,避免内存溢出。
- 小文件:
- 网络读取:根据协议选择
HttpURLConnection(HTTP)或Socket(TCP),注意异常处理和资源关闭。
无论使用哪种方式,都需要注意以下几点:
- 异常处理:文件操作和网络操作都可能抛出
IOException,需使用try-catch或throws处理。 - 资源关闭:及时关闭流、连接等资源,避免资源泄漏,推荐使用
try-with-resources语句。 - 性能考虑:对于大文件或高频读取场景,优先使用缓冲流(如
BufferedReader)提高效率。
通过掌握这些方法和最佳实践,可以灵活应对 Java 开发中各种字符串读取需求,编写出高效、健壮的代码。
















