6

我最近开始接触 Java,想了解一个大型应用程序的 Java 模块。我遇到了这行java代码:

String line = (new BufferedReader(new InputStreamReader(System.in))).readLine();

这个java代码是做什么的。是否有与此等效的 C/C++?

4

5 回答 5

8

System.in是标准输入。

InputStreamReader允许您关联从指定输入(在本例中为标准输入)读取的流,所以现在我们有一个流。

BufferedReader是帮助您使用流的“抽象”。例如,它实现readLine而不是逐个字符地读取,直到您找到一个 '\n' 来获取整行。它只是在这个过程之后返回一个字符串。

所以这一行的意思是:“从标准输入中读取一行并将其存储在line变量中”。

于 2013-02-06T13:40:56.333 回答
7

> What does this java code do

String line是你的字符串对象

new BufferedReader().readLine()BufferedReader的实例,用于从字符输入流中读取文本;并且readline()是它实现读取直到换行符的方法。

new InputStreamReader()为您提供InputStreamReader的实例,它是字节流标准和所需字符流之间的“桥梁” BufferedReader

System.in是标准输入(字节流)


> Is there a C/C++ equivalent of this
嗯...没有称为 C/C++ 的语言... ;)
所以我假设您想为它们中的每一个提供答案。

在 C 中,没有必须使用字符数组的“字符串”,但您可以使用以下命令将数据读入字符数组stdin

char input[100];
...
scanf("%99[^\n]", input);

或者

fgets (input, 100 , stdin) 

在 C++ 中,您将使用:

using namespace std;

string line;
getline(cin, line);
于 2013-02-06T13:48:15.103 回答
4

您的代码段使用链接到 InputStreamReader 的 BufferedReader 从标准输入控制台读取一行并将其存储到 String line 。

缓冲阅读器

从字符输入流中读取文本,缓冲字符,以便高效读取字符、数组和行。可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,默认值足够大。通常,由 Reader 发出的每个读取请求都会导致对底层字符或字节流发出相应的读取请求。因此,建议将 BufferedReader 包装在 read() 操作可能成本高昂的任何 Reader 周围,例如 FileReaders 和 InputStreamReaders。

BufferedReader#readLine()

阅读一行文字。一行被认为是由换行符 ('\n')、回车符 ('\r') 或紧跟换行符的回车符中的任何一个终止的。

输入流读取器

InputStreamReader 是从字节流到字符流的桥梁:它读取字节并使用指定的字符集将它们解码为字符。它使用的字符集可以由名称指定,也可以显式给出,或者可以接受平台的默认字符集。InputStreamReader 的 read() 方法之一的每次调用都可能导致从底层字节输入流中读取一个或多个字节。为了实现字节到字符的有效转换,可以从底层流中预先读取比满足当前读取操作所需的更多的字节。

系统

System 类包含几个有用的类字段和方法。它不能被实例化。

System 类提供的设施包括标准输入、标准输出和错误输出流;访问外部定义的“属性”;一种加载文件和库的方法;以及一种用于快速复制数组的一部分的实用方法。

系统输入

“标准”输入流。该流已经打开并准备好提供输入数据。通常,此流对应于键盘输入或主机环境或用户指定的另一个输入源。

于 2013-02-06T13:41:53.867 回答
1

代码所做的只是简单地从输入流中读取一行。从模式的角度来看,这是一个装饰器。至于使用 BufferedReader 旨在提高 IO 性能。

于 2013-02-06T13:39:41.987 回答
1

InputStreamReader 是从字节流到字符流的桥梁:它读取字节并使用指定的字符集将它们解码为字符。它使用的字符集可以由名称指定,也可以显式给出,或者可以接受平台的默认字符集。

InputStreamReader 的 read() 方法之一的每次调用都可能导致从底层字节输入流中读取一个或多个字节。为了实现字节到字符的有效转换,可以从底层流中预先读取比满足当前读取操作所需的更多的字节。

为了获得最高效率,我们考虑将 InputStreamReader 包装在 BufferedReader 中。例如:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

于 2014-07-03T15:14:38.980 回答