Java中的BufferedReader和InputStreamReader

6

我最近开始学习Java,并希望了解大型应用程序的Java模块。我遇到了以下Java代码行:

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

这段Java代码的作用是什么?是否有C / C ++的等效代码?

4
为什么这被打上了C++和C的标签? - Mats Petersson
еҢ…иЈ…еҷЁе’ҢеҢ…иЈ…еҷЁгҖӮйҰ–е…Ҳйҳ…иҜ»InputStreamReaderе’ҢBufferedReaderзҡ„javadocгҖӮ - Alvin Wong
2
C++中相应的代码大致为std::string line; std::getline(std::cin, line); - jrok
5个回答

8

System.in 是标准输入。

InputStreamReader 允许您将读取指定输入(在本例中是标准输入)的流相关联,因此现在我们有一个流。

BufferedReader 是一个“抽象”概念,它帮助您处理流。例如,它实现了 readLine 方法,而不是逐个字符地读取,直到找到 '\n' 以获取整行内容。它只是在这个过程中返回一个字符串。

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


/facepalm。System.in是标准输入的InputStreamInputStreamReader 是从字节流到字符流的桥梁BufferedReader是一个字符流(Reader),用于高效读取字符、数组和行,不是_帮助您处理流的"抽象"_。 - bit2shift

7

> 这段Java代码是做什么用的

String line 是您的 字符串对象

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

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

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


> 是否有一个C/C++等效的版本
嗯……没有叫做 C/C++ 的语言...... ;)
因此,我会假设您想要针对每个语言都回答一下。

在C中,没有“字符串”,您必须使用字符数组,但是您可以使用类似于以下内容的方式将数据读入到字符数组中:stdin

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

或者

fgets (input, 100 , stdin) 

在C++中,您可以使用以下代码:

using namespace std;

string line;
getline(cin, line);

4
您的代码片段使用了BufferedReader,连接到InputStreamReader,从标准输入控制台读取一行文本并将其存储到字符串line中。
缓冲字符输入流BufferedReader可以高效地读取字符、数组和行文本。可以指定缓冲区大小,也可以使用默认大小。默认大小通常足够使用。通常,在任何read()操作可能成本较高的Reader周围包装一个BufferedReader是明智的,例如FileReaders和InputStreamReaders。
BufferedReader#readLine()方法用于读取一行文本。行分隔符可以是换行符('\n'),回车符('\r'),或回车符后跟换行符。
InputStreamReader将字节流转换为字符流:它读取字节并使用指定的字符集将其解码为字符。可以通过名称或显式给定字符集来指定要使用的字符集,也可以接受平台的默认字符集。每次调用InputStreamReader的read()方法之一都可能会导致从底层字节输入流读取一个或多个字节。为了启用字节转换为字符的高效转换,可能会从底层流中提前读取更多的字节以满足当前的读取操作。
System类包含多个有用的类字段和方法,但不能实例化。其中包括标准输入、标准输出和错误输出流;访问外部定义的“属性”;加载文件和库的方式;以及快速复制数组的实用方法。
System.in是“标准”输入流,这个流已经打开并准备好提供输入数据。通常,该流对应于键盘输入或由主机环境或用户指定的其他输入源。

1

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

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

为了达到最高效率,我们考虑在BufferedReader内包装一个InputStreamReader。例如:

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


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

2
使用BufferedReader是为了readLine()方法,该方法在InputStreamReader中不存在。 - davmac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接